试图读取宽字符给出EOF
我有一个文本文件,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: %sn",errno,strerror(errno)); if (c == WEOF) return 0; } 它打印82 -1(R和EOF的ASCII代码).无论我在文件中的哪个位置都有1,它总是显示为EOF.编辑,我添加了一个errno检查,它给出了这个: Error 84: Invalid or incomplete multibyte or wide character 但是,?是Unicode U+2078 ‘SUPERSCRIPT EIGHT’.我通过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) 在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的返回值不是char,int甚至是wchar_t,而是wint_t.确保您的字符变量c的类型为wint_t,以避免内存问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |