在Unicode 字串類型之間進行轉換
在使用各種程式語言和平台時,可能會遇到在Unicode 字符串類型之間進行轉換的任務。雖然 mbstowcs() 和 wcstombs() 等函數看起來像是可行的轉換選項,但它們的使用可能有問題。
mbstowcs() 和wcstombs() 的限制
這些函數不一定會轉換為UTF-16 或UTF-32,而是轉換為wchar_t,編碼根據區域設定而變化。這給可移植性和 Unicode 支援帶來了困難。
C 11 中引入的更好方法
C 11 引入了幾種在Unicode 字串類型之間轉換的改進方法:
1。 std::wstring_convert
此範本類別提供了執行轉換的便捷方法。建立後,它可用於輕鬆在字串之間進行轉換:
<code class="cpp">std::wstring_convert<..., char16_t> convert; std::string utf8_string = u8"This string has UTF-8 content"; std::u16string utf16_string = convert.from_bytes(utf8_string);</code>
2.新的std::codecvt 專業化
std::codecvt的新專業化也可用於特定的Unicode 轉換:
3。子類別的定義
要繞過std::codecvt 專業化中受保護析構函數的問題,可以定義自訂子類別:
<code class="cpp">template <class internT, class externT, class stateT> struct codecvt : std::codecvt<internT, externT, stateT> { ~codecvt() {} }; std::wstring_convert<codecvt<char16_t, char, std::mbstate_t>, char16_t> convert16;</code>
4。 std::use_facet 範本函數
此函數可用於取得現有的codecvt 實例,由於專業化限制,這對於Visual Studio 2010 很有幫助:
<code class="cpp">std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> convert16;</code>
注意:直接UTF-32 和UTF-16 轉換需要組合std::wstring_convert 的兩個實例。
對Unicode 的wchar_t 的批評
而wchar_t存在用於表示Unicode 代碼點,其目的和實用性有一定的限制:
對於可移植程式碼,建議的方法是使用 C 11 字串轉換或適當的特定於編碼的函式庫。
以上是為什麼 mbstowcs() 和 wcstombs() 不是 Unicode 字串轉換的最佳選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!