簡體   English   中英

檢查字符串時出現“無效的utf 8錯誤”,但是當我使用std :: cout時似乎正確

[英]I get “Invalid utf 8 error” when checking string, but it seems correct when i use std::cout

我正在編寫一些必須讀取utf 8編碼的文本文件並將其發送到OpenGL的代碼。

還使用我從此站點下載的庫: http : //utfcpp.sourceforge.net/

當我寫下來時,我可以在OpenGL窗口上顯示正確的圖像:

std::string somestring = "abcçdefgğh"; //將字符串轉換為utf32編碼。.//我還在程序啟動時設置了local。

但是當我從文件中讀取utf8編碼的字符串時:

  • 該庫警告我該字符串沒有有效的utf編碼
  • 我無法將“從文件讀取”字符串發送到OpenGL。 它崩潰了。
  • 但是我仍然可以使用std :: cout作為我從文件中讀取的字符串(看起來正確)。

我使用以下代碼從文件中讀取:

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

現在的問題是:

  • 如果從文件讀取的字符串不正確,當我使用std :: cout檢查它時,它的外觀如何?

  • 我該如何解決這個問題?

提前致謝:)

您向其編寫輸出的shell可能會針對不了解的字符非常強大。 似乎並非所有使用的軟件都是。 但是,驗證字節序列是否為有效的UTF-8序列應該相對簡單:UTF-8編碼相對簡單:

  • 每個代碼點均以代表要讀取的字節數的字節和前兩個字節開頭:
    • 如果高位為0,則代碼點由一個字節組成,由低7位表示
    • 否則,前1位的位數表示字節的總數,后跟一個零位(明顯),其余位變為代碼點的高位
  • 因為已經表示了1個字節,所以設置了高位和未設置下一個位的字節是連續字節:低6位是代碼點表示的一部分

根據這些規則,有兩件事可能會出錯並使UTF-8無效:

  1. 在期望起始字節的位置遇到一個連續字節
  2. 有一個開始字節表示隨后有更多連續字節

我沒有周圍的代碼可以指出哪里出了問題,但是編寫這樣的代碼應該很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM