簡體   English   中英

c++ 文件加載期間的 UTF8 加擾

[英]UTF8 scrambling during c++ file loading

我知道加載 unicode 有點費力,但我看不出如何將提供給其他人的解決方案應用於我的特定問題。

我有一個 Win7/C++/DirectX9 GUI 庫,可以將文本呈現到屏幕上。 我以前從來沒有遇到過問題,因為它只用於西歐語言。 現在我必須將它與匈牙利語一起使用,這讓我很頭疼。 我的特殊問題是加載該語言中的特殊字符。

舉個例子,FELNŐTTEKNEK,意思是成人。

如果我將此字符串硬編碼到我的應用程序中,它會正確呈現:

guiTitle->SetText( L"FELNŐTTEKNEK" );

這會將字符串存儲為 std::wstring,並使用 ID3DXFont::DrawTextW() 呈現它。 這也證明了我選擇的字體 Futura CE 能夠呈現特殊字符(CE = 中歐)。

到目前為止,一切都很好。 接下來我只是希望能夠從文本文件中加載文本。 沒什么大不了。 但是結果很糟糕,特殊的 Ő 被另一個字符替換,主要是 Å 甚至像 Å 這樣的兩個字符(第二個通常無法打印)

我已通過輸入文本文件確保編碼為 UTF-8 並且天真地嘗試加載它:

wifstream f("data/language.ini");
wstring w;  
getline( f, w );    
guiTitle->SetText( w );

不知何故,我仍在爭吵。 我是否加載為 UTF-8? 有沒有辦法確保這一點? 我只需要確保我有一個寬字符串,其中包含文本編輯器中顯示的文本。

非常感激地收到任何幫助。

忘記wifstream ,讓它工作太難了。 做:

ifstream f(L"data/language.ini");
string str;  
getline( f, str );
guiTitle->SetText( utf8_to_utf16(str).c_str() );

並使用MultiByteToWideChar來實現utf8_to_utf16

另請參閱https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful

DrawTextW 期待 UTF-16。

What you're doing is converting each UTF-8 code unit (byte) into a 16 bit value by zero padding it - this correctly converts UTF-8 to UTF-16 only if your UTF-8 exclusively contains characters from the ascii subset of unicode.

您需要做的是正確地從 UTF-8 轉換為 UTF-16。 將字符串加載到 std::string(不是 std::wstring)中,然后將該 UTF-8 字符串轉換為 UTF-16 字符串,並將其傳遞給 API 期望 UTF-16 字符串。

從來不理解那里宣布的關於在任何地方使用 UTF-8 的想法,自己實現必要的功能(你也可以為 UTF-16 做同樣的事情)然后在與 Windows ZDB9742387014CA8DE63FZA7ACE1 通信時將其轉換回 UTF-16(不知道如何這應該避免 Windows API 中的問題 - 畢竟你仍然給它 UTF-16 字符,因此無論如何都會遇到所有相同的錯誤),似乎很多額外的工作沒有任何好處。

無論如何,而不是“使用 std::string 然后使用低級方法將其轉換為 UTF-16”,您可以讓 API 完成它的工作(注意這可能不會產生最佳性能,Ray Chen 有一些關於這種方式的系列回來-盡管我希望更新的編譯器可以解決這個問題,並且對於一個幾乎不重要的普通文件)。

基本上你可以這樣做:

 std::wifstream src;
 src.imbue(std::locale("UTF-8")); // use correct encoding.
 src.open(file);

如果圖書館也可以這樣做,為什么要自己完成所有工作(每次我不必使用 MultiByteToWideChar 我都認為自己很幸運)-也使意圖更加清晰。

暫無
暫無

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

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