web-dev-qa-db-ja.com

2018年にC ++でUnicodeを処理する適切な方法は?

私はこれに対する答えを見つけるためにstackoverflowを検索しようとしましたが、私が見つけた質問と答えは約10歳であり、私はそうは思えません変更および可能な進歩のために主題のコンセンサスを見つけます。

ユニコードを処理することになっているstl以外にも、いくつかのライブラリがあります。

Stlにはいくつかの機能( wstringcodecvt_utf8 )が含まれていましたが、このサイトはUTF-16を扱っているため、人々は使用について曖昧なようです:( tf-8 everywhere )は使用すべきではなく、オンラインの多くの人がこの前提に同意しているようです.

私が探している唯一のものは、ユニコード文字列で4つのことをする能力です-

  1. 文字列をメモリに読み込む
  2. Unicodeまたはasciiを使用して正規表現で文字列を検索し、ascii + unicodeの数字または文字のいずれかで連結またはテキスト置換/フォーマットを行います。
  3. ASCIIの範囲に収まらない文字については、ASCII + Unicode数値形式に変換します。
  4. 文字列をディスクに書き込むか、どこにでも送信します。

Icuがこれ以上のことを処理していると言えます。私が知りたいのは、Linux、Windows、およびMacOSでこれを処理する標準的な方法があるかどうかです。

お時間をいただきありがとうございます。

27
Lfod

ここでいくつかのアイデアを投げようとします:

  • ほとんどのC++プログラム/プログラマーは、テキストがほとんど不透明なバイトシーケンスであると想定しています。 UTF-8はおそらくそれに対して有罪であり、多くのコメントが再開することに驚きはありません:Unicodeを心配せず、UTF-8エンコードされた文字列を処理するだけです
  • ファイルにはバイトのみが含まれます。現時点では、真のUnicodeコードポイントを内部で処理しようとすると、それをバイトにシリアル化する必要があります->ここでもUTF-8がポイントを獲得します
  • basic Multilingual Plane(16ビットコードポイント)から出ると、事態はますます複雑になります。 emoji は特に処理がひどい:絵文字の後にvariation selector(U + FE0E VARIATION SELECTOR-15(VS15)for textまたはU + FE0F VARIATION SELECTOR-16(VS16)for emoji-style)その表示スタイルを変更します。多かれ少なかれ古いi bs ^ 1970年のASCIIで印刷したいときに使用されたî。それだけではありません。U+ 1F3FBからU + 1F3FFまでの文字は、6つのブロックにまたがる102の人間の絵文字の肌の色を提供するために使用されます。シンボル。

    これは、最大3つの連続したUnicodeコードポイントが1つの単一のグリフを表すことができることを意味します... 1つの文字が1つの文字であるという考えはchar32_tはまだ近似値です

私の結論は、ユニコード複雑なものであり、実際にはICUのような専用ライブラリが必要だということです。 BMPのみを扱う場合は、標準ライブラリのコンバーターのような単純なツールを使用することができますが、完全なサポートはそれをはるかに超えています。


ところで:PythonのようなネイティブなUnicodeサポート(現在のC++のものよりもはるかに優れている)ふりをする)のような他の言語でさえ、いくつかの部分で失敗します:

  • tkinter GUIライブラリーは、BMP-標準IDLE Pythonツールであるが、
  • コア言語サポート(コーデックとunicodedata)に加えて、異なるモジュールまたは標準ライブラリがUnicode専用であり、他のモジュールは、標準ライブラリであるため、絵文字サポートのようなPython Package Indexすべてのニーズを満たしていない

したがって、Unicodeのサポートは10年以上にわたって貧弱であり、今後10年で事態がさら​​に良くなることを期待していません...

12
Serge Ballesta