2012-03-01 111 views
3

我需要从文件中读取Unicode字符。我唯一需要做的就是提取他们的Unicode编号。我使用CodeBlock Mingw在Windows XP上运行。读取文件中的Unicode字符C

我做这样的事情

#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被存储在编码的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个字节。如何做到这一点?再次

感谢您的答复........

+2

的[小端(http://en.wikipedia.org/wiki/Little-endian)UTF-16字节顺序标记(http://en.wikipedia.org/wiki/Byte_order_mark#UTF-16)具有0xFF(255)作为文件的第一个字节。你总是得到相同的字节,因为你的代码不会遍历文件的各个字节。 – 2012-03-01 21:08:36

+0

@FrédéricHamidi,不应该将前两个字节作为单个16位值返回?如果是这样,结果应该不是0xfffe? – 2012-03-01 21:15:25

+0

@Mark,nope,[fgetwc()](http://msdn.microsoft.com/en-us/library/c7sskzc1%28v=vs.100%29。aspx)'根据是否以文本模式或二进制模式打开流,读取[c as]多字节字符或宽字符。[_wfopen()](http://msdn.microsoft.com/zh-cn/library /yeby3zcb%28v=vs.100%29.aspx)没有'mode'参数默认为'text',所以'fgetwc()'试图读取一个多字节字符,在0xFF上扼流圈,并返回*(或所以我认为,我没有真正测试这个假设)*。 – 2012-03-01 21:22:53

回答

4

那么,在你的问题的代码只读取文件的第一个字符,所以你必须实现某种循环构建秩序处理该文件的全部内容。

现在,fgetwc()将返回2550xFF)的原因有三:

  • 你不采取文件的byte-order mark考虑进去,所以你最终读它,而不是实际的文件内容,

  • 你不是在mode参数_wfopen()指定翻译模式标志,所以它默认为textfgetwc()因此尝试读取多字节字符代替邻F A宽字符,

  • 0xFF(一little-endianUTF-16 BOM的第一个字节)可能不是在你的程序的当前代码页前导字节,所以fgetwc()返回时,就没有进一步的处理。

+0

我应该如何调用_wfopen以便fgetwc返回宽字符? – Puneet 2012-03-02 21:03:37

+0

指定'binary'标志:'_wfopen(filename,L“rb”);' – 2012-03-02 21:05:44