簡體   English   中英

在C ++中處理UTF-8

[英]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

看看第一個答案。 我確定它能回答您的問題。

  1. 什么時候應該在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.

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