[英]Handling UTF-8 in C++
為了找出C ++是否適合我的項目,我想測試UTF-8功能。 根據參考,我構建了以下示例:
#include <string>
#include <iostream>
using namespace std;
int main() {
wstring str;
while(getline(wcin, str)) {
wcout << str << endl;
if(str.empty()) break;
}
return 0;
}
但是,當我輸入UTF-8字符時,它的行為不正確:
$ > ./utf8
Hello
Hello
für
f
$ >
它不僅不會打印ü
,而且會立即退出。 gdb
告訴我沒有崩潰,但是正常退出,但是我很難相信。
在Linux上不要使用wstring。
std :: wstring VS std :: string
看看第一個答案。 我確定它能回答您的問題。
- 什么時候應該在std :: string上使用std :: wstring?
在Linux上? 幾乎從不 (§)。
在Windows上? 幾乎總是 (§)。
語言本身與unicode或任何其他字符編碼無關。 它與操作系統綁定。 Windows將UTF16用於Unicode支持,這意味着使用寬字符(16位寬字符)-wchar_t或std:wstring。 每個使用字符串運行的Win Api函數都需要寬字符輸入。
但是基於Unix的系統(例如Mac OS X或Linux)使用UTF8。 當然-這只是如何處理數組中的字節的問題,因此您可以將UTF16字符串存儲在公共C數組或std:string容器中。 這就是為什么您在跨平台代碼中看不到任何字符串的原因。 而是將所有字符串都作為UTF8處理,並在必要時(在Windows上)重新編碼為UTF16。
您還有更多選擇來處理這些令人困惑的事情。 我親自完成了上述操作-通過在所有應用程序中嚴格使用UTF8編碼,在與Windows Api交互時重新編碼字符串,並在Mac OS X上直接使用它們。對於成功的重新編碼,我使用了出色的轉換助手:
C ++ UTF-8轉換幫助器 (在MSDN上,根據Apache許可,版本2.0提供)。
您還可以使用跨平台的Qt字符串,該字符串定義從UTF8到UTF16的轉換函數以及其他編碼(ANSI,Latin ...)。
因此,以上答案-在Unix上始終使用UTF8(std :: string,char),在Windows UTF16(std :: wstring,wchar_t)上為true。
請記住,在啟動主程序時,默認選擇“ C”語言環境。 如果您處理utf-8,則可能不希望這樣做。 調用setlocale(LC_CTYPE, "")
將關閉此默認設置,您將獲得環境中定義的任何內容(大概是utf-8語言環境)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.