C++におけるユニコード文字列は std

wstring で [programming][cxx]

C++ユニコード文字といえば
ICU4C
があるけれど、
APIが非常にJava的なので、あまり使いたくない(STLと相性が悪い)
・正規化処理等を含んでいるので、単に格納して単なる文字列と同じように使いだけの場合にはオーバースペック
などという問題がある。

そこで vector とか考えたけれど、
入出力とかソートとかそれはそれで用意しなければならない。
Javaと違って、統一interfaceをimplementsしてそれを満たせば終わりというわけじゃないので、
面倒。

実は2バイト文字が格納できて入出力もサポートされていて、
かつSTLに対応済(というかSTLの中にある)の
std::wstring
がある。

std::wstring は言語仕様上、単に、
1文字が8ビットより大きいバージョンの std::string
としか定義されていない。
文字長とか文字集合とか、エンコーディングとか、ソート順序とかは全部処理系依存
この辺が原因で、ポータビリティがないとされている。
(2007-12-18T22:41:39+0900) : 実際、文字コードの指定方法(名前)に関して、Linux同士でも互換性がない。また、複数のエンコーディングを扱うのも苦手。

その辺はあくまで言語仕様の話で、存在する実装では
windowslinux で、wstring = UTF-16文字列
ソートはUTF-16の辞書式らしい。(要出典)
linux では UTF-16 を 32ビットのintに入れて格納しているので、メモリはかなり食う。
wstring の作成は
・処理系がlocaleを持っている
ソースコードが locale のエンコーディングで書かれている
・扱うデータが locale のエンコーディングで書かれているものだけ
という前提だったら、

std::wstring s;
std::wcin >> s;

という感じでやれる。
このとき、cinを混在させるとなんかややこしいことになった気がするので注意。