我需要从文件中读取Unicode字符。我需要做的唯一事情是提取他们的Unicode号码。我使用CodeBlock Mingw在Windows XP上运行。
我正在做这样的事情
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#else
#define _MBCS
#endif
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
wchar_t *filename=L"testunicode.txt";
FILE *infile;
infile=_wfopen(filename,L"r");
wchar_t result=fgetwc(infile);
wprintf(L"%d",result);//To verify the unicode of character stored in file,print it
return 0;
}
我的结果总是为255.
testunicode.txt存储在Encoding = Unicode(通过记事本创建)
中最后的任务是从一个文件中读取,该文件可以包含任何语言的字符,但是wchar_t只有2个字节,所以它能够为所有可能的语言字符获取unicode吗?
需要你的帮助......
感谢大家的回复。
现在我已经更改了代码。
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#else
#define _MBCS
#endif
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
wchar_t *filename=L"testunicode.txt";
FILE *infile;
infile=_wfopen(filename,L"r");
wchar_t b[2];
fread(b,2,2,infile);//Read a character from the file
wprintf(L"%d",b[1]);
return 0;
}
它打印正确的UTF 16代码。使用它的项目需要读取世界不同语言的字符。那么UTF-16会后缀还是应该将存储文件的编码更改为UTF-32?此外,这里wchar_t是2个字节,对于UTF-32,我们需要一些具有4个字节的数据类型。怎么做到这一点?
再次感谢您的回复........
答案 0 :(得分:4)
好吧,你问题中的代码只读取你文件的第一个字符,所以你必须实现某种循环结构才能处理该文件的全部内容。
现在,fgetwc()正在返回255
(0xFF
),原因有三:
您没有考虑该文件的byte-order mark,因此您最终会将其读取而不是实际的文件内容,
您未在_wfopen()的mode
参数中指定翻译模式标记,因此默认为text
,fgetwc()
因此尝试读取多字节字符而不是宽字符,
0xFF
(little-endian UTF-16 BOM的第一个字节)可能不是程序当前代码页中的前导字节,因此fgetwc()
将返回进一步处理。