簡體   English   中英

std :: string,std :: wstring和UTF8

[英]std::string, std::wstring and UTF8

我想使用以UTF-8編碼的字符串(對不起,如果措辭不好,請更正我,以便我理解是正確的字符串)。 另外,我希望我的程序可以跨平台。

IIUC,這樣做的正確方法是使用std :: wstring,然后將其轉換為UTF8。 問題是我認為在Linux上std :: string已經用UTF8編碼了(我可能是錯的)。

那么用最少的條件代碼創建std :: {w} string的UTF8表示的最佳方法是什么?

字符串是常量,它們經過硬編碼,將在SQLite查詢中使用。

PS:我將嘗試使用XCode 5,希望它符合C ++ 11。

他們是硬編碼的。

如果所有有問題的字符串都是硬編碼的字符串文字,那么您不需要任何特殊的東西。

聲明此類字符串時,請使用u8前綴,以確保它們以UTF-8編碼。 在支持C ++ 11此功能的每個平台上。 此類字符串的類型為const char [] ,就像常規字符串文字一樣:

const char my_utf8_literal[] = u8"Some String.";

當然,這些也可以存儲在std::string (不是wstring )中:

std::string my_utf8_string = u8"Some String.";

您說過,您的目標是在SQLite查詢和命令中使用它們。 在這種情況下,使一切正常工作應該很容易。 您將使用SQLite的字符串格式化命令來構建查詢,盡管它們對UTF-8不敏感,但是只要您所有的輸入都是UTF-8,輸出也將是有效的UTF-8。 因此,應該沒有任何問題。

對於UTF-8處理,有一個名為tiny-utf8的庫。 它提供了std :: string或更具體的std :: u32string的直接替換(:: value_type是char32_t,但是數據表示形式是帶有char的utf8)。 這或多或少是C ++ 11中處理utf8的最簡單方法。

字符串是常量,它們經過硬編碼,將在SQLite查詢中使用。

如果您對字符串進行了硬編碼,則只需將源文件的編碼更改為UTF8,並在字符串文字前添加U前綴,然后您就可以使用該前綴構造一個utf8_string類來使用它。

那么用最少的條件代碼創建std :: {w} string的UTF8表示的最佳方法是什么?

恕我直言,如果可以的話,請不要使用wchar_t和wstring,因為它們可能是C ++字符串庫中指定最模糊且特定於平台的內容。

我希望這至少可以有所幫助。

雅各布干杯

發布此答案后,問題已更改,並補充說字符串是要在SQL查詢中使用的硬編碼文字。 因為簡單的u8字符串是一個簡單的解決方案,所以這里回答的部分變得無關緊要。 我不會通過此更改或其他更改來解決這個問題。

回覆

”“我想使用UTF-8編碼的字符串(對不起,如果措辭不好,請更正我,以便我理解是正確的字符串)。 另外,我希望我的程序可以跨平台。

那你就很不走運。

Microsoft的文檔明確聲明其setlocale不支持UTF-8:

可用的語言環境名稱,語言,國家/地區代碼和代碼頁集包括Windows NLS API支持的所有語言設置,但每個字符需要兩個以上字節的代碼頁(例如UTF-7和UTF-8)除外。 如果提供的代碼頁值為UTF-7或UTF-8,則setlocale將失敗,並返回NULL


注意:盡管它不起作用™,並且被明確記錄為不起作用,但仍有許多網站和博客,甚至書籍,都以類似鴕鳥的方式推薦了這種方法。 他們通常看起來很權威。 但是這些信息是垃圾。


回覆

以最少的條件代碼創建std :: {w}字符串的UTF8表示的最佳方法是什么?

那要看你有什么。 標准庫提供std::codecvt 之前曾有人問及過它,例如( 將wstring轉換為UTF-8編碼的字符串 )。

暫無
暫無

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

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