2016-04-20 9 views
1

文字列に標準のstd::stringstd::mapオペレーションがUnicodeコード単位をどのように扱うのかを理解したいと思います。std :: stringとstd :: mapオペレーションがUnicode文字列にある

サンプルコード:

include <iostream> 
    #include "sys/types.h" 

    using namespace std; 

    int main() 
    { 

     std::basic_string<u_int16_t> ustr1(std::basic_string<u_int16_t>((u_int16_t*)"ยฤขฃ", 4)); 
     std::basic_string<u_int16_t> ustr2(std::basic_string<u_int16_t>((u_int16_t*)"abcd", 4)); 

     for (int i = 0; i < ustr1.length(); i++) 
      cout << "Char: " << ustr1[i] << endl; 

     for (int i = 0; i < ustr2.length(); i++) 
      cout << "Char: " << ustr2[i] << endl; 

     if (ustr1 == ustr2) 
      cout << "Strings are equal" << endl; 

     cout << "string length: " << ustr1.length() << "\t" << ustr2.length() << endl; 
     return 0; 
    } 

文字列は、タイ文字とASCII文字が含まれており、basic_string<u_int16_t>を使用しての背後にある意図は、シングルバイトに収容できない文字の保管を容易にすることです。コードは、エンコードタイプがen_US.UTF-8のLinuxボックスで実行されました。出力は次のとおりです。

$ ./a.out 
Char: 47328 
Char: 57506 
Char: 42168 
Char: 47328 
Char: 25185 
Char: 25699 
Char: 17152 
Char: 24936 
string length: 4  4 

いくつかの質問:

  1. 出力内の文字値がen_US.UTF-8コードポイントに対応していますか?そうでない場合、彼らは何ですか?

  2. ==,!=,<などの演算子は、ユニコードコードポイントで動作することができますか?もしそうなら、それは対応する場所の各コードポイントの単純な比較ですか?同様の行でstd::mapが動作しますか?

  3. ロケールをUTF-16に変更すると、文字列がUTF-16コードポイントとして保存されることになりますか?

ありがとう!

+0

? – JVApen

+0

@JVApen:現在のシナリオでの動作を理解したいと思います。 – Maddy

+1

文字列リテラル( 'char *')から 'u_int16_t *'へのキャストは無意味です。 – MicroVirus

答えて

7

彼らは文字列の中に存在すべきである私は、操作がUnicodeコード単位を扱う方法を定期的std::stringstd::map理解したいと思います。

これらはありません。

std::stringchar Sまたはバイトの配列です。これは、のいずれかを考慮に入れた "高レベル"の文字列ではありません。エンコーディングあなたはそれを自分で行う必要があります。 ICUのような目的に特化したライブラリを使用します。 std::basic_char<u_int16_t>std::string(すなわちstd::basic_string<char>)からスイッチング

はそれを変更しません。代わりに、あなたが "ワイド"文字のシーケンスを持っていることを意味します。

そしてstd::mapは全くこれとは何の関係もありません。

深い読み:あなたは `のstd :: wstring`を使用していないのはなぜ

+0

説明をありがとう。 UTF-16でエンコードされた文字列(ASCII以外の文字を含む)が 'std :: basic_char '型に格納されている場合、 '=='、 '!='、 '<'私は彼らがエンコードの種類が何か他のものであるLinuxで失敗すると仮定しています。しかし、文字列とプラットフォームのエンコーディングタイプが同じ場合、どうなりますか?この場合、 '=='操作がうまくいかない場合は、その理由を知りたいのです。 – Maddy

+0

私は、これらの文字列の文字列操作*はどのように運賃がかかるのですか? – Maddy

+0

@Maddy:あなたが何を求めているのかははっきりしない。彼らはどうやって「運賃」を得るのですか?彼らは優秀な運賃です。実行するように設計され指定された操作を正確に実行します。すなわち、 'char' /' u_int16_t'のシーケンスの操作ですが、エンコーディングはまったく考慮されていません。私の答えで言いました。しかし、私はなぜあなたが '=='が平等をチェックするという職務を果たせないと思うのか理解できません。 –

関連する問題