2010-06-07 215 views
1

在C++中逐行讀取Unicode文件的正確方法是什麼?逐行讀取Unicode文件C++

我想讀取由Windows記事本保存爲Unicode(LE)的文件。

假設文件在單獨的行上只包含字符A和B.

在讀取由字節的文件字節, 我看到後面的字節序列(十六進制):

FE FF 41 00 0D 00 0A 00 42 00 0D 00 0A 00

SO 2字節BOM, 2字節'A',2字節CR,2字節LF,2字節'B',2字節CR,2字節LF。

我嘗試使用下面的代碼讀取文本文件:

std::wifstream file("test.txt"); 
    file.seekg(2); // skip BOM 
    std::wstring A_line; 
    std::wstring B_line; 
    getline(file,A_line); // I get "A" 
    getline(file,B_line); // I get "\0B" 

我用得到相同的結果>>操盤函數getline

file >> A_line; 
    file >> B_line; 

看來,單字節CR字符 僅作爲單個字節使用。 或CR NULL LF正在被使用,但不是高字節的NULL。 我希望在文本模式下的wifstream會讀取2字節的CR和2字節的LF。

我在做什麼錯? 爲了解析新行,人們似乎不應該在二進制模式下逐字節讀取文本文件 。

回答

5

std::wifstream將寬字符集暴露給程序,它通常是Windows上的UCS-2和Unix上的UTF-32,但假定輸入文件仍使用窄字符。如果您希望它在磁盤上使用寬字符,則需要使用std::codecvt<wchar_t, wchar_t>構面。

您應該能夠找到編譯器的實現std::codecvt<char, char>這也是一個非轉換的代碼轉換方面,並將字符更改爲wchar_ts。