试图读取宽字符给出EOF

时间:2017-08-11 18:12:03

标签: c file unicode fopen widechar

我有一个文本文件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 -1R和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

问题是什么?

1 个答案:

答案 0 :(得分:0)

1。检查WEOF而不是EOF

EOF适用于单字节字符。 WEOF适用于广角色。当用getwc读取宽字符的开头时,有时可以返回单字节EOF。

stdio.h

#define EOF (-1)

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的返回值不是charint,甚至是wchar_t,而是wint_t。确保您的字符变量c的类型为wint_t,以避免出现内存问题。