C 尝试读取宽字符会产生EOF
我有一个文本文件,C 尝试读取宽字符会产生EOF,c,file,unicode,fopen,widechar,C,File,Unicode,Fopen,Widechar,我有一个文本文件,foo.txt,包含以下内容: R⁸2 我有一个大型程序读取它并处理每个字符,但当它点击⁸。以下是代码的相关部分: 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,strer
foo.txt
,包含以下内容:
R⁸2
我有一个大型程序读取它并处理每个字符,但当它点击⁸代码>。以下是代码的相关部分:
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码)。无论我在文件中的哪个位置有imk_
,它总是读作EOFEdit,我添加了一个检查errno
,它给出了以下内容:
Error 84: Invalid or incomplete multibyte or wide character
但是,,⁸ 是我通过cat
将其写入foo.txt
,并从fileformat.info复制粘贴。foo.txt
的hexdump显示:
0000000: 52e2 81b8 32 R...2
有什么问题吗?1。检查WEOF
而不是EOF
EOF
用于单字节字符WEOF
用于宽字符。使用getwc
读取宽字符的开头时,有时会返回单字节EOF
在stdio.h
中:
#define EOF (-1)
#define WEOF (0xffffffffu)
在wchar.h
中:
#define EOF (-1)
#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
的返回值不是char
,int
,甚至不是wchar\u t
,而是wint\u t
。确保字符变量c
的类型为wint\u t
,以避免内存问题。您需要检查WEOF
而不是EOF
,同时将int
更改为wint\/code>。查看文档:以及forintwctob(wint\uwchar)代码>也是。如果wctob
成功转换宽字符,则仅当多字节字符正好是一个字节长时,才会返回其多字节字符表示形式。如果wctob
遇到无法转换为多字节字符的宽字符,或者多字节字符的长度不完全是一个字节,则返回-1
@KeineLust done,updated。尝试使用C.UTF-8
或其他UTF-8语言环境。locale-a
告诉您系统上支持哪些区域设置?@chrisdd已修复!如果你把这个作为回答,我会接受的。另外,您知道为什么setlocale(LC_ALL,”)代码>没有解决问题?我的假设是,可以将其移植到与Unicode兼容的代码页。