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>。查看文档:以及for
intwctob(wint\uwchar)也是。如果
wctob
成功转换宽字符,则仅当多字节字符正好是一个字节长时,才会返回其多字节字符表示形式。如果
wctob
遇到无法转换为多字节字符的宽字符,或者多字节字符的长度不完全是一个字节,则返回
-1
@KeineLust done,updated。尝试使用
C.UTF-8
或其他UTF-8语言环境。
locale-a
告诉您系统上支持哪些区域设置?@chrisdd已修复!如果你把这个作为回答,我会接受的。另外,您知道为什么
setlocale(LC_ALL,”)没有解决问题?我的假设是,可以将其移植到与Unicode兼容的代码页。