簡體   English   中英

在 C++17 / C++20 中從 wstring 轉換為 u16string 並返回(符合標准)

[英]Conversion from wstring to u16string and back (standard conform) in C++17 / C++20

我的主要平台是 Windows,這就是我在內部使用 UTF-16(主要是 BMP 字符串)的原因。 我想對這些字符串使用控制台 output 。

不幸的是,沒有std::u16coutstd::u8cout所以我需要使用std::wcout 因此,我必須將我的 u16strings 轉換為 wstrings - 最好(也是最簡單)的方法是什么?

在 Windows 上,我知道 wstring 指向 UTF16 數據,因此我可以創建一個使用相同數據的簡單 std::u16string_view(無轉換)。 但是在 Linux wstring 通常是 UTF32... 有沒有辦法做到這一點沒有宏和假設 sizeof(wchar_t) == 2 => utf16?

C++20 標准中沒有任何內容可以將wchar_t轉換為char32_t並返回。 畢竟, wchar_t 應該足夠大以包含任何支持的代碼點。

實際上,在 U+FFFF 以上的任何地方 Unicode 都受支持, wchar_t是 32 位的,除了 Windows (和 Java),但這無關緊要。 所以是的,即使在今天以便攜方式使用 Unicode 也是有問題的,並且sizeof(wchar_t)==2#ifdef _WIN32聽起來都是合法的解決方法。

話雖如此,無論底層編碼如何, wcout仍然可以在所有平台上與wchar_t無縫協作。

只有當您剪切wstring 或使用單個代碼點並且您希望支持基本平面之外的代碼點,您才需要考慮代理對(這仍然很容易,0xD800–0xDBFF = 第一對,0xDC00– 0xDFFF = 第二對,不要插在中間)。

暫無
暫無

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

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