文字列に標準のstd::string
とstd::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
いくつかの質問:
出力内の文字値が
en_US.UTF-8
コードポイントに対応していますか?そうでない場合、彼らは何ですか?==
,!=
,<
などの演算子は、ユニコードコードポイントで動作することができますか?もしそうなら、それは対応する場所の各コードポイントの単純な比較ですか?同様の行でstd::map
が動作しますか?ロケールをUTF-16に変更すると、文字列がUTF-16コードポイントとして保存されることになりますか?
ありがとう!
? – JVApen
@JVApen:現在のシナリオでの動作を理解したいと思います。 – Maddy
文字列リテラル( 'char *')から 'u_int16_t *'へのキャストは無意味です。 – MicroVirus