C ++でのUnicode処理


回答:


81
  • ICUを使用 してデータ(または同様のライブラリ)を処理する
  • あなた自身のデータストアで、すべてが同じエンコーディングで保存されていることを確認してください
  • 文字列の長さ、大文字の使用状況などの日常的なタスクには、常にUnicodeライブラリを使用していることを確認してくださいis_alpha。希望する定義でない限り、標準ライブラリの組み込み関数を使用しないでください。
  • 私はそれを十分に言うことはできません:正確さを気にするstring場合はaのインデックスを決して反復しないでください、これには常にあなたのユニコードライブラリを使用してください。

stringをバイナリデータとして扱わない限り。
デミ

10

以前の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などを使用して、より詳細な処理を行う必要があります。現在、さまざまなエンコーディング間のテキスト変換をより強力にサポートするための提案がいくつか進められています。これは次のテクニカルレポートの一部になると思います(そして希望します)。


ドラフト標準ドキュメントへのリンクは、あなたが話している「組み込みのUnicodeサポート」を説明する特定のセクションへの参照がなければ、あまり役に立ちません。
ベンコリンズ

1
@BenCollins 2.14.5 項「文字列リテラル」-UTF -8、UTF-16、およびUTF-32エンコーディングの文字列リテラルを含む、文字列リテラルについて説明します。 セクション22.4.1.4「クラステンプレートcodecvt」 -文字エンコーディング(UTF-8、UTF-16、UTF-32を含む)間の変換に使用されるcodecvtクラスについて説明します。文書全体にUnicodeサポートの詳細が記載されていますが、これらはこの主題の最も重要なセクションのようです。
エストラーダ2014年


5

Windowsプログラミングのチェックリストは次のとおりです。

  • _T( "my string")で囲まれたすべての文字列
  • strlen()などの関数が_tcslen()などに置き換えられました
  • char *およびconst char *の代わりにLPTSTRおよびLPCTSTRを使用します
  • Dev Studioで新しいプロジェクトを開始するときは、プロジェクトのプロパティでUnicodeオプションが選択されていることを確認してください。
  • C ++文字列の場合、std :: stringの代わりにstd :: wstringを使用します

11
UnicodeビルドとANSIビルドの両方を行うつもりでない限り、「T」文字列、文字、関数を使用しないでください。Unicodeビルドのみを行う場合は、通常のワイド文字を実行します。L "my wide string" wcslen(L "my string")など
1800 INFORMATION

そうですね、_Tマクロは、汎用テキスト、つまりUnicodeとAscii / MBCSの両方をコーディングする機能が必要な場合にのみ使用してください。

1
C ++文字列に対してUnicodeとANSIの両方を実行する場合は、typedef std :: basic_string <TCHAR> tString;のようなものを使用します。
セルジュ

ええ、私は常に#ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endifを実行しますが、私はあなたの方がSergeのほうが好きです。
アダムピアース

4
正直なところ、UTF16は無駄だと思います。すべてのエンコーディングをUTF8のままにしておくと、* nixの方が簡単で互換性が高くなります。
chacham15 2012年

3

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
  • 混合環境での互換性の問題
  • Unicodeデータ変換
  • WindowsベースのプログラムをUnicodeに移行する
  • 概要

2

これはすべての人にとってベストプラクティスとは限りませんが、必要に応じて独自のC ++ UNICODEルーチンを作成できます。

週末に終わりました。多くのことを学びましたが、100%バグがないことを保証するものではありませんが、多くのテストを行ったところ、正しく動作しているようです。

私のコードはNew BSDライセンスの下にあり、ここで見つけることができます:

http://code.google.com/p/netwidecc/downloads/list

これはWSUCONVと呼ばれ、UTF-8、UTF-16、および標準ASCII間で変換するサンプルmain()プログラムが付属しています。メインコードを捨てれば、UNICODEを読み書きするための素晴らしいライブラリが手に入ります。


1

上記で述べたように、大規模なシステムを使用する場合はライブラリが最善の策です。ただし、自分で処理したい場合もあります(おそらく、ライブラリがマイクロコントローラーのような多くのリソースを使用するためです)。この場合、実際に必要なもののためにパーツをコピーできる単純なライブラリが必要です。

Willow Schlangerのサンプルコードは良いようです(詳細については彼の回答を参照してください)。

また、コードが小さいものの、完全なエラーチェックがなく、UTF-8のみを処理するが、部品を取り出すのが簡単な別のコードも見つけました。

まともな組み込みライブラリのリストは次のとおりです。

組み込みライブラリ



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.