14

std::u16stringとC++11を見ることができてうれしいですstd::u32stringが、なぜstd::u8stringUTF-8の場合を処理できないのか疑問に思っています。UTF-8を対象とした印象を受けてstd::stringいますが、うまく機能していないようです。std::string.length()つまり、文字列内の文字数ではなく、文字列のバッファのサイズを返しませんか?

length()では、新しいC ++ 11クラス用に定義された標準文字列のメソッドはどのようになっていますか?文字列のバッファのサイズ、コードポイントの数、または文字数を返しますか(サロゲートペアが2コードポイントであると仮定しますが、1文字です。間違っている場合は修正してください)。

そして、どうですかsize(); 等しくないlength()ですか?私の混乱の原因については、http://en.cppreference.com/w/cpp/string/basic_string/lengthを参照してください。

したがって、私の基本的な質問は、、、をどのように使用しstd::string、バッファサイズ、コードポイントの数、std::u16stringおよびstd::u32string文字数を適切に区別するかということです。標準のイテレータを使用する場合、バイト、コードポイント、または文字を反復処理していますか?

4

3 に答える 3

18

u16stringu32string「新しいC++11クラス」ではありません。std::basic_stringそれらはforchar16_tcha32_ttypesのtypedefにすぎません。

lengthsizeは常にに等しいbasic_string。これはT文字列内のの数です。ここTで、はのテンプレートタイプですbasic_string

basic_stringいかなる方法、形状、形式でもUnicodeに対応していません。コードポイント、書記素、Unicode文字、Unicode正規化、またはその他の種類の概念はありません。これは単にsの順序付けられたシーケンスですT。Unicodeを認識している唯一のことはu16stringu32stringによって返される型u""U""リテラルを使用することです。したがって、Unicodeでエンコードされた文字列を格納できますが、そのエンコードの知識を必要とすることは何もしません。

イテレータはT、「バイト、コードポイント、または文字」ではなく、の要素を反復処理します。Tの場合char16_t、sを繰り返しchar16_tます。文字列がUTF-16でエンコードされている場合、Unicodeコードポイントやバイトではなく、UTF-16コード単位で反復処理されます。

于 2012-09-03T16:37:44.573 に答える
1

すべての文字列タイプは同じことを行います。要素のシーケンスを保持し、各タイプは文字列の文字タイプです。length()両方ともsize()要素の数を返します。イテレータ要素に対するイテレータ。文字数の計算などの高レベルの分析には、はるかに複雑な計算が必要です。

于 2012-09-03T16:29:09.783 に答える
0

現在、コードユニット、コードポイント、または個々のバイトを区別するための標準には何も組み込まれていません。ただ、こういうことを扱っている作品もあるようです。標準化委員会が決定する内容に応じて、TR2または次の標準の一部になる場合があります。

于 2012-11-29T07:32:09.133 に答える