189

C++11 が Unicode をサポートしていることを読み、聞いたことがあります。それに関するいくつかの質問:

  • C++ 標準ライブラリは Unicode をどの程度サポートしていますか?
  • すべきstd::stringことをしますか?
  • どうやって使うの?
  • 潜在的な問題はどこにありますか?
4

5 に答える 5

41

Unicode は、標準ライブラリではサポートされていません(サポートされているという合理的な意味で)。

std::stringに勝るものはありませんstd::vector<char>: Unicode (またはその他の表現/エンコーディング) を完全に無視し、そのコンテンツを単にバイトの塊として扱います。

blobの保存とカテネートのみが必要な場合は、かなりうまく機能します。しかし、Unicode 機能 (コード ポイントの数、書記素の数など) が必要になるとすぐに、運が悪くなります。

これについて私が知っている唯一の包括的なライブラリはICUです。ただし、C++ インターフェイスは Java インターフェイスから派生したものであるため、慣用的なものとは言えません。

于 2013-06-14T09:28:05.567 に答える
26

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 を扱っている場合は、調べる必要があります。ワイド文字列型。

于 2013-06-14T08:34:45.497 に答える
8

C++11 には、Unicode 用の新しいリテラル文字列型がいくつかあります。

残念ながら、統一されていないエンコーディング (UTF-8 など) の標準ライブラリでのサポートはまだ不十分です。たとえば、UTF-8 文字列の長さ (コードポイント単位) を取得する良い方法はありません。

于 2013-06-14T08:14:38.097 に答える
4

ただし、 tiny-utf8と呼ばれる非常に便利なライブラリがあり、これは基本的に/のドロップイン置換です。まだ不足している utf8-string コンテナー クラスのギャップを埋めることを目的としています。std::stringstd::wstring

これは、utf8 文字列を「処理」する最も快適な方法かもしれません (つまり、Unicode の正規化や類似のものを使用しません)。文字列は run-length-encoded でエンコードされたままですが、 codepointsを快適に操作できますchar

于 2016-11-30T15:20:18.890 に答える