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 バイト) として?
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が決定するでしょう。
コンパイラは文字列の型を変更しません。宣言すると、それらがエンコードされます。
Windows NT およびそれ以降のバージョン (2000、XP、2003、Vista、7、8、8.1、10) は、内部で 2 バイト文字を使用します (「ワイド文字」と呼びます)。UCS-2
Windows 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 は文字列を変更しません。A
API 関数のバージョンに渡す文字列を内部的に ANSI から Unicode に変換するだけです。また、Unicode から ANSI (可能な場合) に変換しA
、API 関数のバージョンによって返される文字列 (GetWindowTextA()
など) を返します。