2013-12-19 17 views
0

我寫一些代碼,必須閱讀UTF-8編碼的文本文件,並將它們發送到OpenGL的似乎是正確的。檢查字符串時,我得到「無效的UTF-8的錯誤」,但是當我使用std ::法院

也在使用這是我從這個網站下載庫:http://utfcpp.sourceforge.net/

當我寫下這我可以顯示在OpenGL窗口右邊的圖像:

std::string somestring = "abcçdefgğh"; //字符串轉換爲UTF32編碼.. //我也在程序啓動時設置本地。

但是,當我從文件中讀取UTF-8編碼的字符串:

  • 庫警告我關於字符串已經不是一個合法的UTF編碼
  • 我不能發送「讀取文件」串到OpenGL。它崩潰。
  • 但我仍然可以使用std ::法院因我從文件中讀取(它看起來右)的字符串。

我用這個代碼讀取文件:

void something(){ 
std::ifstream ifs("words.xml"); 
std::string readd; 
if(ifs.good()){ 
while(!ifs.eof()){ 
std::getline(ifs, readd); 
// do something.. 
} 
} 
} 

現在的問題是:

  • 如果是從文件中讀取的字符串是不正確的,它是如何看如預期當我檢查它與std :: cout?

  • 如何我能得到這個問題解決了嗎?

感謝提前:)

+0

您的編譯器是否支持utf8中的源文件?你還需要通過在'u8'前面加上前綴來確保你的字符串是utf8。 – KitsuneYMG

+0

感謝您的回覆:)我正在使用MinGW,源文件是utf8編碼的。因此,似乎MinGW支持它:)即使我不使用u8前綴,它不會導致問題,因爲源是utf 8編碼(或者可能是別的東西,它沒有錯誤)。 – gokaysatir

回答

1

的外殼,你寫的輸出可能是反對不理解字符,而穩健。看來,並非所有使用的軟件都是。它應該,然而,是相對簡單的驗證,如果你的字節序列是一個合法的UTF-8序列:使用UTF-8編碼是比較直截了當:

  • 每個代碼點與代表數的字節開始字節被讀和第一幾個字節:
    • 如果高位爲0,則代碼點包括由7較低位所表示的一個字節的
    • 否則前導1的位的數目表示的總數字節後跟一個零位(有意義),其餘位成爲代碼點的高位
  • 由於1個字節已經表示的,與該高比特設置和未設置下位字節是延續字節:低6位是基於這些規則的代碼點

的表示的部分有兩件事情可以出錯,使UTF-8無效:

  1. 延續字節是在哪裏開始字節預計一個點遇到
  2. 有指示着更多的延續起始字節然後字節其次是

我沒有任何代碼可以顯示出錯的地方,但是寫這樣的代碼應該是相當直接的。

+0

謝謝你的幫助:) 我發現我試圖將字符串轉換爲utf32兩次。 當我嘗試將utf32(假設爲utf8)轉換爲utf32時,它崩潰了。 當我試圖檢查它使用std :: cout它顯示正確的字符。 我想這意味着MinGW命令窗口支持UTF32(我沒有想到)。 再次感謝。 – gokaysatir

相關問題