web-dev-qa-db-ja.com

C ++プロジェクトタイプ:ユニコードとマルチバイト。長所と短所

スタックオーバーフローコミュニティが、Unicodeまたはマルチバイト文字セットを使用してプロジェクト(ここでは主にC++と考える)を作成するときにどう思うかと思います。

  • すべての文字列がワイドフォーマットになることを意味して、最初からUnicodeに移行するプロはいますか?より大きな文字の標準的な使用のために、パフォーマンスの問題/より大きなメモリ要件はありますか?

  • この方法には利点がありますか?一部のプロセッサアーキテクチャはワイド文字をより適切に処理しますか?

  • 追加の言語をサポートする予定がない場合、プロジェクトをUnicodeにする理由はありますか?

  • マルチバイト文字セットでプロジェクトを作成する理由は何ですか?

  • 上記のすべての要因は、高性能の環境(現代のビデオゲームなど)でどのように衝突しますか?

30
Stefan Valianu

私がコメントする2つの問題。

まず、ターゲットにしているプラ​​ットフォームについては言及しません。最近のWindowsバージョン(Win2000、WinXP、VistaおよびWin7)は、文字列を使用したシステムコールのマルチバイトバージョンとUnicodeバージョンの両方をサポートしていますが、Unicodeバージョンの方が高速です(マルチバイトバージョンは、Unicodeに変換し、Unicodeバージョンを呼び出し、返されたすべてを変換するラッパーです)文字列をマルチバイトに戻します)。したがって、これらのタイプの呼び出しを多数行う場合、Unicodeはより高速になります。

追加の言語を明示的にサポートする予定がない場合でも、アプリケーションがユーザーが入力したテキストを保存して表示する場合は、Unicodeのサポートを検討する必要があります。アプリケーションが非言語対応であるからといって、すべてのユーザーが非言語対応になるということにはなりません。彼らはあなたの英語GUIを完全に喜んで使用しているかもしれませんが、名前、コメント、または他のテキストを自分の言語で入力し、それらを適切に表示したい場合があります。

26

ここでVC++プロジェクトの設定について話しているのですね?

影響を受けるのは、Win32 APIコールのバージョンが実行されるだけです。たとえば、MessageBoxへの呼び出しは、マルチバイト設定の場合はMessageBoxAへの呼び出し、Unicode設定の場合はMessageBoxWへの呼び出しとして終了します。もちろん、それはその関数の文字列パラメータのタイプにも影響します。内部的には、MessageBoxAは、文字列パラメーターを現在のシステムロケールからUnicodeに変換した後、MessageBoxWを呼び出します。

私のアドバイスは、Unicode設定を使用して、Unicode文字列をWin32 API呼び出しに渡すことです。これは、他のエンコーディングで文字列を内部的に使用することを妨げるものではありません。

11

短い答え(IMO、および私は間違っていることが証明されています)は、悪い方(または観点によっては最善)を計画し、今すぐunicodeを実行することをお勧めします。

アプリケーションが文字列を集中的に使用する場合を除き、Unicodeに直接アクセスすることは実際には問題になりません。ゲームの場合、それはエンジンの他の部分と比較して大きな要因であってはなりません。

マックス。

10
Max

簡単な考慮事項は次のとおりです。プログラムが菅直人氏によって使用されている場合、プログラムは機能する必要がありますか?彼のホームディレクトリをASCIIで表すのは難しいかもしれません。

8
MSalters

最初からUnicodeに移行するプロはいますか、

数年後、100万行のコードで、「はい」と回答したことを願います。

すべての文字列がワイドフォーマットになることを意味しますか?

Microsoftが「Unicode」とUTF-16の融合をやめてほしいと思います。

すべての文字列をワイドフォーマットで保存する必要はありません。代わりにUTF-8を使用すると、メモリフットプリントが小さくなり(ラテンアルファベット言語の場合)、7ビットASCIIとの下位互換性が得られます。

WindowsでUTF-8を使用することの欠点の1つは、ANSIコードページとしてサポートされていないため、WinAPI呼び出しを行うために文字列をUTF-16に変換する必要があることです。これが引き起こす不便さは、Windowsプログラムを作成しているか、Windowsでたまたま実行するだけのプログラムを作成しているかによって異なります。

6
dan04

その質問への最初の回答 する必要があります...知っておく必要があるすべてに回答してください。

1
Klaim