我有一个文本文件,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
(ASCII 码为R
和 EOF)。无论我在哪里¹
在文件中,它始终读作 EOF。Edit,我添加了一个检查errno
它给出了这个:
Error 84: Invalid or incomplete multibyte or wide character
然而,⁸ 是统一码 U+2078 ‘上标八’ http://www.fileformat.info/info/unicode/char/2078/index.htm。我写给foo.txt
via cat
并从 fileformat.info 复制粘贴。一个十六进制转储foo.txt
shows:
0000000: 52e2 81b8 32 R...2
有什么问题?
1. 检查WEOF
代替EOF
EOF
适用于单字节字符。WEOF
适用于宽字符。当读取宽字符的开头时getwc
,有时会返回单字节 EOF。
In stdio.h
:
#define EOF (-1)
In wchar.h
:
#define WEOF (0xffffffffu)
2. 将语言环境设置为支持 Unicode 的语言环境
C 程序的默认语言环境是C
, 也叫POSIX
,仅适用于 ASCII。使用setlocale
,有时需要为支持 Unicode 的代码页显式设置适当的区域设置。C.UTF-8
是便携式的。
setlocale(LC_ALL,"C.UTF-8");
setlocale(LC_CTYPE,"C.UTF-8");
3. 对宽字符使用正确的类型
返回值getwc
isn't char
, int
甚至wchar_t
, it's wint_t
。确保你的字符变量c
属于类型wint_t
,避免内存问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)