我有一个文本文件foo.txt
,其中包含以下内容:
R⁸2
我有一个大型程序读取它并对每个角色做事情,但是当它到达⁸
时它总是收到EOF。这是代码的相关部分:
setlocale(LC_ALL,"");
FILE *in = fopen(argv[1],"r");
while (1) {
wint_t c = getwc(in);
printf("%d ",wctob(c));
if (c == -1)
printf("Error %d: %s\n",errno,strerror(errno));
if (c == WEOF)
return 0;
}
打印82 -1
(R
和EOF的ASCII代码)。无论我在文件中的¹
,它总是显示为EOF。 修改,我添加了对errno
的检查,并给出了:
Error 84: Invalid or incomplete multibyte or wide character
但是,⁸是Unicode U+2078 'SUPERSCRIPT EIGHT'。我通过foo.txt
将其写入cat
并从fileformat.info复制粘贴。 foo.txt
的hexdump显示:
0000000: 52e2 81b8 32 R...2
问题是什么?
答案 0 :(得分:0)
WEOF
而不是EOF
EOF
适用于单字节字符。 WEOF
适用于广角色。当用getwc
读取宽字符的开头时,有时可以返回单字节EOF。
在stdio.h
:
#define EOF (-1)
在wchar.h
:
#define WEOF (0xffffffffu)
C程序的默认语言环境是C
,也称为POSIX
,仅适用于ASCII。使用setlocale
,有时需要将适当的语言环境显式设置为支持Unicode的代码页。 C.UTF-8
是可移植的。
setlocale(LC_ALL,"C.UTF-8");
setlocale(LC_CTYPE,"C.UTF-8");
getwc
的返回值不是char
,int
,甚至是wchar_t
,而是wint_t
。确保您的字符变量c
的类型为wint_t
,以避免出现内存问题。