我创建了一个包含以下字符的文本文件来测试 utf-8 编码:
%gÁüijȐʨΘЋЮѦҗԘՔהڳضणணษ༒Ⴃᎃᡧᬐ⁜₪≸☺⛜⺟むヸ㒦㢒
我还用 C 语言编写了这个程序来打开文件并读取它:
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *ptr;
ptr = fopen("inputtest.txt", "r, ccs=UTF-8");
char input[50];
if (ptr == NULL)
perror("Error opening file");
else {
if (fgets(input, 50, ptr) != NULL) {
puts(input);
}
printf(input);
fclose(ptr);
}
}
如果我不使用
ccs=UTF-8
,我会得到一些不可读的字符。但有了它,程序就会崩溃并显示代码-1073740791
。此外,在使用 wchar_t
和 fgetws
后,程序的输出只是 %
。
注意:我使用的是Windows 11和Visual Studio 2022,我需要输入多语言字符。
在所有情况下您都拨打
printf(input)
:
input
失败时,
fgets()
的内容是不确定的。使用这样的格式字符串调用
printf
具有未定义的行为。
fgets()
成功,用从文件中读取的字符串调用
printf
是一件有风险的事情。如果字符串包含
%
符号,但后面没有紧跟着另一个
%
,则该行为未定义,因为
printf
将查找您未传递的变量参数。