【发布时间】:2018-01-20 08:09:07
【问题描述】:
我有一个文本文件 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'。我通过cat 将它写给foo.txt 并从fileformat.info 复制粘贴。 foo.txt 的十六进制转储显示:
0000000: 52e2 81b8 32 R...2
有什么问题?
【问题讨论】:
-
您需要检查
WEOF而不是EOF,还将int更改为wint_t。查看文档:cplusplus.com/reference/cwchar/getwc -
还有docs for
int wctob(wint_t wchar);。 如果wctob成功转换了一个宽字符,它返回它的多字节字符表示,只有当多字节字符正好是一个字节长时。如果wctob遇到无法转换为多字节字符的宽字符或多字节字符不完全是一个字节长,则返回–1。 -
@KeineLust 完成,更新。
-
尝试使用
C.UTF-8或其他一些UTF-8 语言环境。locale -a告诉您系统上支持的语言环境是什么? -
@ChrisDodd 已修复!如果您将其发布为答案,我会接受。另外,你知道为什么
setlocale(LC_ALL,"");没有解决问题吗?我假设可以将其设置为与 Unicode 兼容的代码页。
标签: c file unicode fopen widechar