簡體   English   中英

C ++中的Unicode和std :: string

[英]Unicode and std::string in C++

如果我用C ++寫一個隨機字符串來包含一些unicode字符,我的文本編輯器告訴我,我沒有創建一個有效的UTF-8文件。

// Code example
const std::string charset = "abcdefgàèíüŷÀ";
file << random_string(charset); // using std::fstream

我該怎么做才能解決這個問題? 我是否需要進行大量額外的手動編碼? 我理解它的方式,std :: string不關心編碼,只關心字節,所以當我傳遞一個unicode字符串並將其寫入文件時,肯定該文件應包含相同的字節並被識別為UTF- 8編碼文件?

random_string很可能是罪魁禍首; 我想知道它是如何實現的。 如果您的字符串確實是UTF-8編碼並且random_string看起來像

std::string random_string(std::string const &charset)
{
    const int N = 10;
    std::string result(N);
    for (int i=0; i<N; i++)
        result[i] = charset[rand() % charset.size()];
    return result;
}

然后它會采取隨機char期從charset ,這在UTF-8(如其他海報指出)不是Unicode代碼點,但簡單的字節。 如果它從UTF-8多字節字符的中間選擇一個隨機字節作為第一個字節(或者將其放在7位ASCII兼容字符之后),那么您的輸出將不是有效的UTF-8。 請參閱WikipediaRFC 3629

解決方案可能是在random_string 轉換為UTF-32和從UTF-32 random_string 我相信wchar_tstd::wstring在Linux上使用UTF-32。 只要您保持在基本多語言平面內,UTF-16也是安全的。

我該怎么做才能解決這個問題? 我是否需要進行大量額外的手動編碼? 我理解它的方式,std :: string不關心編碼,只關心字節,所以當我傳遞一個unicode字符串並將其寫入文件時,肯定該文件應包含相同的字節並被識別為UTF- 8編碼文件?

你是正確的std::string編碼不可知。 它只包含一個char元素數組。 如何將這些char元素解釋為文本取決於環境。 如果您的語言環境未設置為某種形式的Unicode(即UTF-8或UTF-16),那么當您輸出字符串時,它將不會顯示/解釋為Unicode。

你確定你的字符串文字“abcdefgàèíüŷÀ” 實際上是 Unicode,而不是例如Latin-1嗎? (ISO-8859-1或可能的Windows-1252)? 您需要確定您的平台當前配置使用的區域設置。

- - - - - -編輯 - - - - - -

我想我知道你的問題: charset字符串文字中的一些Unicode字符,如重音字符“À”,是雙字節字符(假設是UTF-8編碼)。 使用random_string函數中的[]運算符處理字符集字符串時,將返回Unicode字符的一半 因此, random-string函數創建無效的字符串。

例如,請考慮以下代碼:

std::string s = "À";
std::cout << s.length() << std::endl;

在字符串文字被解釋為UTF-8的環境中,此程序將輸出2 因此,字符串的第一個字符( s[0] )只是Unicode字符的一半 ,因此無效。 由於random_string函數使用[]運算符按單個字節尋址字符串,因此您將創建無效的隨機字符串。

所以是的,你需要使用std::wstring ,並使用L前綴創建你的charset string-literal。

在您的代碼示例中, std::string charset存儲您編寫的內容 也就是說,如果您使用UTF-8文本編輯器來編寫它,那么您在文件輸出中收到的內容就是UTF-8文本。

UTF-8只是一種編碼方案,其中不同的字符使用不同的字節大小。 但是,如果您使用UTF-8編輯器,它將編碼,用兩個字節說“ñ”, 並且 ,當您將其寫入文件時,它將具有兩個字節(再次符合UTF-8)。

問題可能是您用於創建源C ++文件的編輯器。 它可能使用latin1或其他一些編碼。

要編寫UTF-8,您需要使用像這樣的codecvt方面。 這里可以看到如何使用它的一個例子。

暫無
暫無

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

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