![](/img/trans.png)
[英]std::u32string conversion to/from std::string and std::u16string
[英]std::u16string, std::u32string, std::string, length(), size(), codepoints and characters
我很高興在C ++ 11中看到std::u16string
和std::u32string
,但我想知道為什么沒有std::u8string
來處理UTF-8的情況。 我的印象是std::string
適用於UTF-8,但似乎並不是很好。 我的意思是, std::string.length()
仍然返回字符串緩沖區的大小而不是字符串中的字符數?
那么,如何為新的C ++ 11類定義標准字符串的length()
方法呢? 它們是否返回字符串緩沖區的大小,代碼點的數量或字符數(假設代理對是2個代碼點,但是一個字符。如果我錯了,請糾正我)?
那么size()
? 是不是等於length()
? 請參閱http://en.cppreference.com/w/cpp/string/basic_string/length ,了解我的困惑之源。
所以,我想,我的基本問題是如何使用std::string
, std::u16string
和std::u32string
並正確區分緩沖區大小,代碼點數和字符數? 如果使用標准迭代器,是否要迭代字節,代碼點或字符?
u16string
和u32string
不是“新的C ++ 11類”。 它們只是char16_t
和cha32_t
類型的std::basic_string
typedef。
length
始終等於任何basic_string
size
。 這是多少T
的字符串,其中T
是為模板類型basic_string
。
basic_string
不以任何方式,形狀或形式basic_string
Unicode。 它沒有代碼點,字形,Unicode字符,Unicode規范化或任何類型的概念。 它只是一個有序的T
s序列。 關於u16string
和u32string
唯一知道Unicode的是它們使用u""
和U""
文字返回的類型。 因此,它們可以存儲Unicode編碼的字符串,但它們不需要知道所述編碼。
迭代器迭代T
元素,而不是“字節,代碼點或字符”。 如果T
是char16_t
,那么它將迭代char16_t
s。 如果字符串是UTF-16編碼的,那么它將迭代UTF-16代碼單元,而不是Unicode代碼點或字節。
所有字符串類型都做同樣的事情:它們包含一系列元素,每個元素的類型都是字符串的字符類型。 length()
和size()
都返回元素的數量。 迭代器迭代元素。 更高級別的分析,例如計算字符數,需要更復雜的計算。
目前,標准中沒有任何內容可以區分代碼單元,代碼點或單個字節。 但是,似乎有些事情正在處理這類事情 。 根據標准委員會的決定,它可能是TR2或下一個標准的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.