C++ での Unicode 処理のベスト プラクティスは何ですか?
9 に答える
- ICUを使用 してデータ (または同様のライブラリ) を処理します
- 独自のデータ ストアでは、すべてが同じエンコーディングで保存されていることを確認してください
is_alpha
文字列の長さ、大文字化のステータスなどの日常的なタスクには、常に Unicode ライブラリを使用していることを確認してください。それが必要な定義でない限り、標準ライブラリの組み込みを使用しないでください。- 私はそれを十分に言うことはできません:正確さを気にする場合は、 a のインデックスを反復処理しないでください。これには常に Unicode ライブラリを使用してください。
string
以前の C++ 標準との下位互換性を気にしない場合、現在の C++11 標準には Unicode サポートが組み込まれています: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf
したがって、C++ での Unicode 処理の真のベスト プラクティスは、組み込みの機能を使用することです。ただし、現在の標準は非常に新しいため、古いコードベースでは常に可能とは限りません。
編集: 明確にするために、C++ 11 は Unicode リテラルと Unicode 文字列をサポートするようになったという点で Unicode に対応しています。ただし、標準ライブラリの Unicode 処理と変換のサポートは限定的です。現在のニーズには、これで十分かもしれません。ただし、今すぐに大量の重労働を行う必要がある場合は、より詳細な処理のためにICUなどを使用する必要があるかもしれません。現在、異なるエンコーディング間のテキスト変換をより強力にサポートするためのいくつかの提案が進行中です。私の推測 (および希望) は、これが次のテクニカル レポートの一部になることです。
当社 (およびその他の企業) は、もともと Taligent が開発したオープン ソースのInternation Components for Unicode (ICU) ライブラリを使用しています。
文字列、ロケール、変換、日付/時刻、照合、変換などを処理します。アル。
以下は、Windows プログラミングのチェックリストです。
- _T("my string") で囲まれたすべての文字列
- strlen() など _tcslen() などに置き換えられた関数
- char * および const char * の代わりに LPTSTR および LPCTSTR を使用します。
- Dev Studio で新しいプロジェクトを開始するときは、プロジェクトのプロパティで Unicode オプションが選択されていることを確認してください。
- C++ 文字列の場合、std::string の代わりに std::wstring を使用します
C++ での大文字と小文字を区別しない文字列比較を見てください。
その質問には、Unicode に関する Microsoft ドキュメントへのリンクがあります: http://msdn.microsoft.com/en-us/library/cc194799.aspx
その記事の横にある MSDN の左側のナビゲーション サイドを見ると、Unicode 関数に関する多くの情報が見つかるはずです。これは、「文字のエンコード」に関する章の一部です ( http://msdn.microsoft.com/en-us/library/cc194786.aspx ) 。
次のサブセクションがあります。
- コードページ モデル
- Windows の 2 バイト文字セット
- ユニコード
- 混合環境での互換性の問題
- Unicode データ変換
- Windows ベースのプログラムを Unicode に移行する
- 概要
これは誰にとってもベスト プラクティスではないかもしれませんが、必要に応じて独自の C++ UNICODE ルーチンを作成できます。
ちょうど週末にやり終えました。100% バグがないことを保証するものではありませんが、多くのことを学びました。多くのテストを行い、正しく動作しているようです。
私のコードは New BSD ライセンスの下にあり、ここで見つけることができます:
http://code.google.com/p/netwidecc/downloads/list
これは WSUCONV と呼ばれ、UTF-8、UTF-16、および標準 ASCII の間で変換を行うサンプルの main() プログラムが付属しています。メインのコードを捨てれば、UNICODE を読み書きするための素敵なライブラリが手に入ります。
上で述べたように、大規模なシステムを使用する場合はライブラリが最適です。ただし、自分で処理したい場合もあります (ライブラリがマイクロコントローラーのように多くのリソースを使用するため)。この場合、実際に必要なものの一部をコピーできる単純なライブラリが必要です。
Willow Schlanger のサンプル コードは良いもののようです (詳細については、彼の回答を参照してください)。
また、コードが小さいが、完全なエラー チェックがなく、UTF-8 のみを処理するが、部品を取り出すのが簡単な別のものも見つけました。
まともな組み込みライブラリのリストを次に示します。
組み込みライブラリ
- http://code.google.com/p/netwidecc/downloads/list (UTF8、UTF16LE、UTF16BE、UTF32)
- http://www.cprogramming.com/tutorial/unicode.html (UTF8)
- http://utfcpp.sourceforge.net/ (シンプルな UTF8 ライブラリ)