-1

Windows NT は、Windows NT API 全体でデフォルトのエンコード方法として Unicode (2 バイト幅の UTF-16) を使用します。デフォルトの文字セットとして ASCII またはマルチバイト文字セットの使用を選択すると、ASCII が Unicode に変換されます。また、ASCII 文字セットを使用すると、Unicode よりも遅くなります。この変換は何を意味するのでしょうか? ASCII API を Unicode API に変換するだけですか、それともすべての文字列を変換しますか? 例: で C/C++ ファイルを作成するとしconst char* text = "Hello, world!"ます。Windows NT でコンパイルすると、コンパイルされたバイナリ ファイルに "Hello, world!" が格納されます。Unicode (26 バイト) または ASCII (13 バイト) として?

4

2 に答える 2

2

ANSI と Unicode のどちらの API バージョンを使用するかを決定する必要があります。関数を明示的に使用するか (ANSI の場合は CreateFileA、Unicode の場合は CreateFileW など)、関数名を「A」または「W」なしで使用し、_UNICODE プリプロセッサ変数が 2 つの関数のどちらを使用するかを決定します。特定の関数には、文字列を含む構造体が必要です。次に、これらの構造体にも 2 つのバージョンがあります (OSVERSIONINFOA と OSVERSIONINFOW など)。現在、ANSI に正当な理由はありません。

ただし、これは引数にのみ適用され、コンテンツには適用されません。データへのポインターとそのサイズを使用して文字列をファイルに書き込む場合、変換は行われません。

あなたの質問に答えるには: 明示的に使用charしたため、13 バイトを使用します。使用した場合wchar、26 バイトを使用します。あなたが書くことができconst TCHAR* text = _T("Hello world!");、その後_UNICODEが決定するでしょう。

于 2016-02-06T01:18:17.693 に答える
1

コンパイラは文字列の型を変更しません。宣言すると、それらがエンコードされます。

Windows NT およびそれ以降のバージョン (2000、XP、2003、Vista、7、8、8.1、10) は、内部で 2 バイト文字を使用します (「ワイド文字」と呼びます)。UCS-2Windows NT はエンコーディングを使用していました。Windows 2000 以降は に切り替わりましたUTF-16LE

文字列を処理するほとんどの API 関数には、2 つの異なるバージョンがあります。ANSI 文字列を処理Aする名前は で終わり、もう一方の名前はW(「ワイド文字」の「W」) で終わります。マクロ定義のセットは、接尾辞なしの名前をAまたはWバージョンのいずれかにマップします。選択は、という名前のマクロの存在によって駆動され_UNICODEます。ただし、プログラマーは、状況に応じAて関数または関数を自由に呼び出すことができます。W

開発者がワイド文字列を処理できるようにするために、Microsoft が提供する標準 C ライブラリには、ワイド文字列を処理するための一連の関数が含まれています ( .aso に相当) strlen()strcat()それらの名前は通常、 にstr置き換えられていwcsます。

プログラマーは、使用する各関数のバージョンを決定する人です。ほとんどの場合、エンコーディングを変換する必要はありません (上記のいずれかに固執する限り)。ただし、オプションがないサブシステムもあります。文字列を機能させるには、文字列を Unicode に変換する必要があります。

Windows が API で文字列を処理する方法について詳しくは、https ://msdn.microsoft.com/en-us/library/windows/desktop/ff381407%28v=vs.85%29.aspx をご覧ください。

あなたの質問に答えるために、Windows は文字列を変更しません。AAPI 関数のバージョンに渡す文字列を内部的に ANSI から Unicode に変換するだけです。また、Unicode から ANSI (可能な場合) に変換しA、API 関数のバージョンによって返される文字列 (GetWindowTextA()など) を返します。

于 2016-02-06T01:26:34.540 に答える