C++11 が Unicode をサポートしていることを読み、聞いたことがあります。それに関するいくつかの質問:
- C++ 標準ライブラリは Unicode をどの程度サポートしていますか?
- すべき
std::string
ことをしますか? - どうやって使うの?
- 潜在的な問題はどこにありますか?
Unicode は、標準ライブラリではサポートされていません(サポートされているという合理的な意味で)。
std::string
に勝るものはありませんstd::vector<char>
: Unicode (またはその他の表現/エンコーディング) を完全に無視し、そのコンテンツを単にバイトの塊として扱います。
blobの保存とカテネートのみが必要な場合は、かなりうまく機能します。しかし、Unicode 機能 (コード ポイントの数、書記素の数など) が必要になるとすぐに、運が悪くなります。
これについて私が知っている唯一の包括的なライブラリはICUです。ただし、C++ インターフェイスは Java インターフェイスから派生したものであるため、慣用的なものとは言えません。
Unicode NUL std::string
( U+0000) は UTF-8 の null バイトでありchar[]
、char*
これが null byte は UTF-8 で発生する可能性があります。したがって、UTF-8 文字列はすべての C および C++ 文字列関数に従って適切に終了し、C++ iostream (ロケールが UTF-8 である限り、std::cout
およびを含む) を使用してそれらを処理できます。std::cerr
UTF-8でできないことはstd::string
、コード ポイントで長さを取得することです。std::string::size()
文字列の長さをbytesで示します。これは、UTF-8 の ASCII サブセット内にいる場合のコード ポイントの数にのみ等しくなります。
UTF-8 文字列をコード ポイントレベルで操作する必要がある場合(つまり、単に格納して出力するだけでなく)、または多くの内部ヌル バイトを含む可能性が高い UTF-16 を扱っている場合は、調べる必要があります。ワイド文字列型。
C++11 には、Unicode 用の新しいリテラル文字列型がいくつかあります。
残念ながら、統一されていないエンコーディング (UTF-8 など) の標準ライブラリでのサポートはまだ不十分です。たとえば、UTF-8 文字列の長さ (コードポイント単位) を取得する良い方法はありません。
ただし、 tiny-utf8と呼ばれる非常に便利なライブラリがあり、これは基本的に/のドロップイン置換です。まだ不足している utf8-string コンテナー クラスのギャップを埋めることを目的としています。std::string
std::wstring
これは、utf8 文字列を「処理」する最も快適な方法かもしれません (つまり、Unicode の正規化や類似のものを使用しません)。文字列は run-length-encoded でエンコードされたままですが、 codepointsを快適に操作できますchar
。