簡體   English   中英

std :: u16string,std :: u32string,std :: string,length(),size(),代碼點和字符

[英]std::u16string, std::u32string, std::string, length(), size(), codepoints and characters

我很高興在C ++ 11中看到std::u16stringstd::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::stringstd::u16stringstd::u32string並正確區分緩沖區大小,代碼點數和字符數? 如果使用標准迭代器,是否要迭代字節,代碼點或字符?

u16stringu32string不是“新的C ++ 11類”。 它們只是char16_tcha32_t類型的std::basic_string typedef。

length始終等於任何basic_string size 這是多少T的字符串,其中T是為模板類型basic_string

basic_string不以任何方式,形狀或形式basic_string Unicode。 它沒有代碼點,字形,Unicode字符,Unicode規范化或任何類型的概念。 它只是一個有序的T s序列。 關於u16stringu32string唯一知道Unicode的是它們使用u""U""文字返回的類型。 因此,它們可以存儲Unicode編碼的字符串,但它們不需要知道所述編碼。

迭代器迭代T元素,而不是“字節,代碼點或字符”。 如果Tchar16_t ,那么它將迭代char16_t s。 如果字符串是UTF-16編碼的,那么它將迭代UTF-16代碼單元,而不是Unicode代碼點或字節。

所有字符串類型都做同樣的事情:它們包含一系列元素,每個元素的類型都是字符串的字符類型。 length()size()都返回元素的數量。 迭代器迭代元素。 更高級別的分析,例如計算字符數,需要更復雜的計算。

目前,標准中沒有任何內容可以區分代碼單元,代碼點或單個字節。 但是,似乎有些事情正在處理這類事情 根據標准委員會的決定,它可能是TR2或下一個標准的一部分。

暫無
暫無

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

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