13

私はこのユニコードとマルチバイトのことで本当に混乱しています。

プログラムをUnicodeでコンパイルしているとしましょう(ただし、最終的には、使用する文字セットに依存しないソリューションが必要です)。

1)すべての「char」はワイド文字として解釈されますか?

2)単純なprintfステートメント、つまりprintf( "Hello World \ n");がある場合。文字列がない場合、_tprintfと_T( "...")を使用せずにそのままにしておくことはできますか?printfステートメントに文字列が含まれている場合は、_tprintfと_T( "...")、つまり_tprintf( "Hello%s \ n"、name);を使用する必要があります。?

3)バッファに読み込みたいテキストファイル(デフォルトの形式で保存されている、つまり使用されているデフォルトの文字セットを変更しない)がある場合でも、TCHARの代わりにcharを使用できますか?特に私がそれを文字ごとに読んでいる場合、つまり文字ポインタをインクリメントすることによって?

ありがとうございました。

よろしく、レイン

4

3 に答える 3

4

まず、UNICODE/_UNICODEを使用してコンパイルしていて、他のプラットフォームをターゲットにするつもりがない場合は、TCHARビジネスの使用を避け、どこでもWCHAR(またはwchar_t) および W 関数を使用できます。

1) すべての 'char' はワイド文字として解釈されますか?

charC では、定義により、1 バイトです。(これは、1バイトでもあるプラットフォームで「ワイド文字」であることを技術的に排除するものではありませんがwchar_t、MSVCを使用していてWindowsプラットフォームをターゲットにしていることを考えると、そうではありません.)

したがって、実用的な目的のために、これに対する答えは「いいえ」です。

2) 単純な printf ステートメントがある場合、つまり printf("Hello World\n"); 文字列がない場合、_tprintf と _T("...") を使用せずにこのままでいいですか? printf ステートメントに文字列が含まれている場合は、_tprintf と _T("...") を使用する必要があります。つまり、_tprintf("Hello %s\n", name); ?

ASCII 文字列リテラルを出力している場合は、引き続きprintf.

ASCII の範囲外にある可能性のある任意の文字列を出力する場合は、_tprintf(またはwprintf) を使用する必要があります。

3) バッファに読み込みたいテキスト ファイル (デフォルトの形式で保存されている、つまり、使用されているデフォルトの文字セットを変更していない) がある場合、TCHAR の代わりに char を使用できますか? 特に、文字ポインターをインクリメントして、文字ごとに読んでいる場合はどうなりますか?

「既定の形式」とは何ですか?

外部ファイルを読み込むときは、まず最初の数バイトを読み込んで UTF-16 または UTF-8 BOM をチェックしてから、それに基づいて決定する必要があります。

于 2010-02-09T04:16:04.957 に答える
2

1) すべての 'char' はワイド文字として解釈されますか?

いいえ。ただし、すべての s はsTCHARとして解釈されますwchar_t

おそらく winnt.h がこれをどのように指定するかを考えてみましょう:

#ifdef UNICODE
 typedef WCHAR TCHAR;
#else
 typedef CHAR TCHAR;
#endif

呼び出すと、またはのいずれかSomeApi()にラップされます。(引数は実際には's になりますが、要点はわかります)。SomeApiA(char *arg)SomeApiW(wchar_t *arg)TCHAR

したがって、ソース コードは、「ANSI」バージョンまたは Widechar バージョンのいずれかにコンパイルできるという意味で「独立」します。TCHARこれが機能するには、プリミティブ型の代わりにを使用する必要があります。

2) 単純な printf ステートメントがある場合、つまり printf("Hello World\n"); 文字列がない場合、_tprintf と _T("...") を使用せずにこのままでいいですか? printf ステートメントに文字列が含まれている場合は、_tprintf と _T("...") を使用する必要があります。つまり、_tprintf("Hello %s\n", name); ?

tprintf上記の定義と同じように機能すると推測できる以外は、ファミリを知りません。つまり、は引数としてtprintfを取りTCHAR、設定に応じてはそれらをs またはsUNICODEとして扱います。charwchar_t

3) バッファに読み込みたいテキスト ファイル (デフォルトの形式で保存されている、つまり使用されているデフォルトの文字セットを変更していない) がある場合、TCHAR の代わりに char を使用できますか? 特に、文字ポインターをインクリメントして、文字ごとに読んでいる場合はどうなりますか?

ファイルの内容がどの文字エンコーディングを使用するかは、完全にそれ自体次第であり、 TCHAR's'とは何の関係もありません。TCHARは、win32 API 呼び出しで使用するファイル名などに使用されます。

于 2010-02-09T13:01:50.587 に答える
0

プログラムを Unicode でコンパイルしているとします (ただし、最終的には、使用する文字セットに依存しないソリューションが必要です)。

これは、人間が話す言語ではなくプログラミング言語のように、言語によって異なります。「自分のプログラムを Unicode でコンパイルする」とはどういう意味ですか?

  1. すべての 'char' はワイド文字として解釈されますか?

    • 選択した言語とオプションによって異なります。たとえば、Java は 16 ビット文字を使用します (UTF-16 または UCS-2 を格納します。昔は UCS-2 でしたが、現在は UTF-16 であると想定しています)。C では、少なくとも Unix ベースのコンパイラでは、基本的な 'char' 型を 8 ビット以外のものとして解釈するためにかなりの作業が必要になります。
  2. 単純な printf ステートメントがある場合、つまり printf("Hello World\n"); 文字列がない場合、_tprintf と _T("...") を使用せずにこのままでいいですか? printf ステートメントに文字列が含まれている場合は、_tprintf と _T("...") を使用する必要があります。つまり、_tprintf("Hello %s\n", name); ?

    • これには、標準とはほど遠いため、作業しているプラ​​ットフォームについてある程度理解する必要があります。これは MSVC であると思われます... MSVC を使用していないため、権威を持つことが難しくなっています。ただし、ISO C99 標準 (MSVC では明確にサポートされていません) はfwprintf()、ワイド文字の文字列を出力するなどの機能を提供します。特定のコンパイラに関する情報が必要な場合は、質問に正しい情報をタグ付けしてください。
  3. バッファに読み込みたいテキスト ファイル (デフォルトの形式で保存されている、つまり使用されているデフォルトの文字セットを変更していない) がある場合、TCHAR の代わりに char を使用できますか? 特に、文字ポインターをインクリメントして、文字ごとに読んでいる場合はどうなりますか?

    • 繰り返しますが、TCHAR は標準ではなく、MSVC に非常に固有のものです。標準 C では、適切な関数を適用すると、ファイル ストリームは「方向」(ワイド指向またはバイト指向) を取得します。閉じる (または で再度開く) まで、その向きのままfreopen()です。
于 2010-02-09T03:37:38.930 に答える