38

私はエンコーディングに精通していませんが、私が知っていると思うことは次のとおりです(間違っているかもしれませんが):

  1. ASCIIは、7ビットの固定長エンコーディングであり、ASCIIチャートにある文字を使用します。
  2. UTF8は、8ビットの可変長エンコーディングです。すべての文字はUTF8で記述できます。
  3. UCS-2 LE / BEは、最も一般的な文字をサポートする固定長の16ビットエンコーディングです。
  4. UTF-16は、16ビットの可変長エンコーディングです。すべての文字はUTF16で記述できます。

それらは何よりも正しいですか?

さて、質問のために:

  1. Windowsの「A」関数(などSetWindowTextA)はASCII文字列を取り込みますか?または「マルチバイト文字列」(これについては以下でさらに質問します)?
  2. Windowsの「W」関数はUTF-16文字列またはUCS-2文字列を取り込みますか?彼らはUCS-2を取り入れていると思いましたが、名前がわかりにくいです。
  3. WideCharToMultiByteでは、Microsoftは「ワイド文字列」という単語をUTF-16を意味するために使用します。その文脈では、「マルチバイト文字列」とは何と見なされますか?UTF-8?
  4. LPWSTR「ワイド文字列」ですか?そうだと思いますが、それではUTF-16という意味ではないでしょうか。そして、それは、たとえば4バイトの文字を表示するために使用できるという意味ではないでしょうか。そうでない場合、... 4バイト文字を表示することは不可能ですか?(WindowsにはそれらのAPIがないようです。)
  5. WideCharToMultiByteのスーパーセットの機能はwcstombsありますか?両方とも同じタイプの文字列で機能しますか?または、一方はUTF-16で動作し、もう一方はUCS-2で動作しますか?
  6. ファイルパスはUTF-16またはUCS-2ですか?WindowsがMicrosoftのドキュメントから「不透明な文字の配列」として扱っていることは知っていますが、のような関数のC標準に従って、fwprintf標準化されたエンコーディングはありますか?
  7. 「ANSI」エンコーディングとは何ですか?それも正しい用語ですか?そしてそれはASCIIとどのように関係していますか?
  8. (もっと質問がありましたが、これで十分です...とにかくそれらのいくつかを忘れました...)

これらは多くの質問であるため、これらすべてがどのように接続するかについての説明へのリンク(とにかくWindows APIでは役に立たないUnicode標準を読むことを除いて)も大歓迎です。

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

4

4 に答える 4

31

上記はすべて正しいですか?

はい、Unicode でエンコードされていない文字の存在を想定していない場合 (ほとんどの実用的なアプリケーションでは、この想定で問題ありません)。

Windows の "A" 関数 (SetWindowTextA など) は ASCII 文字列を受け取りますか? または「マルチバイト文字列」(これについては以下でさらに質問があります)?

これらは、現在の「ANSI」/MBCS/レガシー エンコーディングでエンコードされたバイト文字列 (つまり、コード単位がバイトであり、Windows では常にオクテットである文字列) を取ります。「ANSI」はこれらのエンコーディングの歴史的な用語ですが、正しくありません。Western Windows システムの場合、このエンコーディングは通常 Windows-1252 です。

Windows の "W" 関数は UTF-16 文字列または UCS-2 文字列を受け取りますか? 私は彼らが UCS-2 を取り入れていると思っていましたが、その名前が私を混乱させました。

Windows 2000 以降、それらのほとんどは UTF-16 をサポートしています。「ワイド」という名前と残りの Microsoft 用語 (たとえば、「UTF-16」または「UCS」を意味する「Unicode」) は、最新の Unicode 標準が用語を統一する前に選択されました。

WideCharToMultiByte では、Microsoft は「ワイド文字列」という言葉を UTF-16 の意味で使用しています。そのコンテキストでは、「マルチバイト文字列」とは何ですか? UTF-8?

Windows-1251 や UTF-8 など、サポートされている他のすべてのエンコーディングWideCharToMultiByteは、このコンテキストでは「マルチバイト エンコーディング」です。

LPWSTR は「ワイド文字列」ですか? だと思いますが、それではUTF-16ではないでしょうか?ということは、たとえば 4 バイト文字を表示するために使用できるということではないでしょうか。そうでない場合は... 4バイト文字の表示は不可能ですか?(Windows にはこれらの API がないようです。)

LPWSTRwchar_tは、 Windows では常に 16 ビットの符号なし整数を指すポインターです。エンコーディングがすべての Unicode 文字をエンコードできる限り、どの文字を表示できるかはエンコーディングとは関係ありません。Windows は通常、BMP 以外の文字を表示できますが、どこでも表示できるわけではありません (たとえば、コンソールでは表示できません)。

WideCharToMultiByte の機能は wcstombs のスーパーセットですか? どちらも同じタイプの文字列で機能しますか? それとも、一方は UTF-16 で動作し、もう一方は UCS-2 で動作しますか?

詳しくはわかりませんが、あまり変わらないと思います。BMP 以外の文字を UTF-8 に変換して、結果が正しいかどうかを調べてみてください。

ファイル パスは UTF-16 または UCS-2 ですか? Microsoftのドキュメントから、Windowsがそれを「文字の不透明な配列」として扱うことは知っていますが、fwprintfなどの関数のC標準に従って、標準化されたエンコーディングはありますか?

ファイル パスは、実際には UTF-16 文字の不透明な配列です。つまり、Windows は、ファイル名を保存または読み取るときに、いかなる種類の変換も実行しません (Linux や Mac OS X とは異なります)。しかし、Windows にはまだほとんど定義されていない大文字と小文字を区別しない奇妙な動作があり、同等に扱われるファイル名が必ずしも等しいとは限らないため、多くの問題が発生します。それは多くの不変条件を破ります。たとえば、他のスレッドからの干渉を受けない Linux では、あるディレクトリに 2 つのファイルを正常に作成するAa、最終的に 2 つの別個のファイルが作成されますが、Windows では 1 つのファイルしか作成されません (一般に、予測できない数のファイルが作成されます)。 )。

「ANSI」エンコーディングとは何ですか? それは正しい用語ですか?ASCII との関係は?

ANSI はアメリカの標準化団体です。エンコーディングを指すときにこの単語を使用するのは誤称ですが、頻繁に使用されるため、注意する必要があります。レガシー 8 ビット エンコーディングという用語を好むのは、それが本質的にそれであると考えているからです。つまり、レガシー (Windows 9x) アプリケーションとの互換性のためにのみ保持される非 Unicode エンコーディングです。欧米のシステムでは、これは通常 Windows-1252 であり、ASCII の適切なスーパーセットです。

于 2011-01-06T12:22:03.647 に答える
8
  1. *A 関数は、アクティブな ANSI コードページを使用しました。

  2. ※W関数はUTF-16を使用します。

  3. マルチバイトとは、CodePage パラメーターで渡されるすべてのものを指します。最も一般的なのは、アクティブな ANSI コードページまたは UTF-8 です。

  4. LPWSTR は UTF-16 文字列で、null で終了する場合と終了しない場合があります ( MSDNを参照) 。

  5. 私は wcstombs について何も知りません。私は常に WideCharToMultiByte を使用しています。

  6. ファイル パスは UTF-16 です。実際、Windows ではすべてのテキストが内部的に UTF-16 です。

  7. ANSIエンコーディングについては、それについて詳しく読む必要があります。ウィキペディアから始めて、そこからリンクをたどるよりも悪いことをする可能性があります.

それが助けになることを願っています。何か間違っている場合は、もっと知っている人はこれを編集してエラーを修正してください!

于 2011-01-04T12:00:36.710 に答える
7

幅の広い弦は以前は UCS-2 でした。Windows 2000 以降、ワイド文字列は UTF-16 です。古いレガシーシステムを維持する必要があるかどうかを知っておくとよいでしょう。

于 2011-01-06T12:36:47.943 に答える
2

まず、この SO トピックで多くの情報を見つけることができます。

ASCII は文字セットであり、エンコーディングではありません。現在、多数の 8 ビット文字セットがあり、そのうちの 1 つがシステムでデフォルトとして設定されています (地域設定で変更できます)。*A 関数は、その文字セットで 8 ビット文字を受け入れます。UTF-8 は文字セットではなく、Unicode 文字セットのエンコーディングです。*W 関数は、私が理解しているように、UCS-2 ではなく UTF-16 を使用します。

于 2011-01-04T10:10:23.357 に答える