2012-03-01 105 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