3

VisualAgeによって開発されたANSIC++プロジェクトがあります。英語のオペレーティングシステムで多言語文字を正しく表示できるように、Unicodeに変換したいと思います。マクロを定義した後、すべてのchar変数をに変更しました。wchar_tUNICODE

これは正しい方法ですか?ソースコードには文字列のみを受け入れるAPIがいくつかあります( 、、char*など)。コード内のすべての文字列がに変更されているので、どうすればそれらを文字列で機能させることができますか?system()fopen()mkdir()wchar_twchar_t

4

2 に答える 2

1

Unicode 文字列を表す方法はいくつかありますが、最も一般的な方法は次のとおりです。

  • でエンコードされ、文字列UTF-8に格納されますchar
  • でエンコードされUTF-16、16 ビット整数で構成される文字列に格納されます
  • でエンコードされUTF-32、32 ビット整数で構成される文字列に格納されます。

UTF-16 および UTF-32 の場合、システムのバイト オーダーを認識し、文字列をビッグ エンディアンまたはリトル エンディアンのどちらで通信するかを決定する必要があります。

という名前の古いエンコーディングがありUCS-2、このエンコーディングでは 0x10000 未満の Unicode 文字しか表現できません。これを使用しないでください。すべての漢字を表現できるわけではありません。

注意すべきもう 1 つのことは、wchar_t幅が 2 バイトまたは 4 バイトであるため、一部のシステムでは を保持するために使用でき、他のシステムではUTF-16文字UTF-32を保持できることです。

注意すべきもう 1 つの点: ほとんどの文字列長関数は、表される Unicode シンボルの数ではなく、カウントされたバイト数または単語数を返します。

個人的には、すべてを として内部および外部に保存しUTF-8、必要に応じて 16 ビットまたは 32 ビットのエンコーディングに変換することを好みます。そうすれば、バイトオーダーの問題を回避できます。

すべてが でエンコードされていることを確認すればUTF-8、ほとんどのものが機能する可能性があります。

于 2013-01-31T08:58:22.187 に答える
1

テキストで何をしているのか、どこから来たのかを知らずに言うのは難しい. ファイルから読み込んで表示するだけなら、に変更charする だけwchar_tで十分かもしれません。(しかし、この場合は、charUTF-8 を使用することに固執することを検討することをお勧めします。) より多くのことを開始すると、問題はより複雑になります。

  • あなたが観察したように、ファイル名のようなものは一般的にchar. UTF-8 を使用すると、この問題を回避できますが、どの文字列が有効かどうかは未解決の問題であり、主にシステムに依存します。

  • 何をしようとしているのかによっては、解析がより難しくなる場合があります。おそらく<ctype.h>;の単純な関数を忘れる必要があります。C++ には で<locale>使用できる関数がありますがwchar_t、使いやすさはかなり劣ります。そしてisspace、特定の区切り文字の検索は多かれ少なかれ宣伝されているように機能しますが、次のようなtoupperことが非常に問題になります(上部と下部の間に普遍的に1対1の関係があるわけではないため).

  • UTF-16 または UTF-32 でファイルを読み書きする場合、エンディアンが問題になります。内部で使用されるタイプとエンコーディングに関係なく、charデータをインポートまたはエクスポートするときは常に UTF-8 を使用します。

char全体として、重要な構文解析やテキスト操作を行っていない限り、私は と UTF-8を使い続ける傾向があります。その場合、UTF-16 を完全にサポートする ICU ライブラリーを調べます。そして、単一のプラットフォームのみをサポートする必要があると 100% 確信していない限り、永遠に、wchar_t実際の標準サイズやエンコーディングがない . たとえば、ICU は UTF-16 文字をunsigned short. (同じことが にも言えますがchar、8 ビットでないマシン charは非常にまれであり、国際化のために遭遇する可能性が高い唯一のエンコーディングUTF-8 です。)

于 2013-01-31T09:06:16.507 に答える