Windows API:ANSIおよびワイドキャラクター文字列 - UTF8ですか、それともASCIIですか? UTF-16またはUCS-2 LE?
-
15-10-2019 - |
質問
私はエンコーディングを持っているプロではありませんが、ここに私が知っていると思うことがあります(それは間違っているかもしれませんが):
- ASCIIは、ASCIIチャートで見つけることができる7ビットの固定長エンコードです。
- UTF8は、8ビットの可変長エンコードです。すべての文字はUTF8で書くことができます。
- UCS-2 LE/BEは、最も一般的な文字をサポートする固定長、16ビットエンコーディングです。
- UTF-16は、16ビットの可変長エンコードです。すべての文字はUTF16で書くことができます。
それらは何よりも正しいですか?
さて、質問のために:
- Windowsの「A」機能を実行します(次のように
SetWindowTextA
)ASCII文字列を取り入れますか?または「マルチバイト文字列」(以下の詳細については)? - Windowsの「W」機能は、UTF-16文字列またはUCS-2文字列を取り入れていますか?私は彼らがUCS-2を取り入れていると思ったが、名前は私を混乱させた。
- の widechartomultibyte, 、Microsoftは「ワイドキャラクター文字列」という言葉を使用してUTF-16を意味します。その文脈では、「マルチバイト文字列」と見なされるものは何ですか? UTF-8?
- は
LPWSTR
「ワイドキャラクター文字列」?私はそれがそうだと言うでしょうが、それはそれがUTF-16であるという意味ではないでしょうか?そして、それはそれがたとえば、4バイトのキャラクターを表示するために使用できるという意味ではないでしょうか?そうでない場合、... 4バイトの文字を表示することは不可能ですか? (WindowsにはAPIがないようです。) - の機能です
WideCharToMultiByte
のスーパーセットwcstombs
, 、そして彼らは両方とも同じタイプの文字列で動作しますか?または、1つはUTF-16で動作し、もう1つはUCS-2で動作しますか? - UTF-16またはUCS-2のファイルパスはありますか? Windowsは、Microsoftのドキュメントからの「キャラクターの不透明な配列」として扱っているが、C標準では、
fwprintf
, 、標準化されたエンコードはありますか? - 「ANSI」エンコードとは何ですか?それは正しい用語ですか?そして、それはASCIIとどのように関係していますか?
- (私はもっと質問がありましたが、これで十分です...とにかくそれらのいくつかを忘れました...)
これらは多くの質問です。そのため、これらすべてがどのように接続するかについての説明へのリンク(とにかくWindows APIを使用しないUnicode標準を読み取ることは別として)も大歓迎です。
ありがとうございました!
解決
それらは何よりも正しいですか?
はい、Unicodeでエンコードされていない文字の存在を想定しない場合(ほとんどの実用的なアプリケーションでは、この仮定は問題ありません)。
Windows "a"関数(setWindowTextaなど)はASCII文字列を取りますか?または「マルチバイト文字列」(以下の詳細については)?
彼らは、現在の「ANSI」/MBCS/レガシーエンコーディングにエンコードされたバイト文字列(つまり、コードユニットがバイトである文字列)を取ります。 「ANSI」はこれらのエンコーディングの歴史的用語ですが、正しくありません。 Western Windowsシステムの場合、このエンコードは通常Windows-1252です。
Windowsの「W」機能は、UTF-16文字列またはUCS-2文字列を取り入れていますか?私は彼らがUCS-2を取り入れていると思ったが、名前は私を混乱させた。
Windows 2000以来、それらのほとんどはUTF-16をサポートしています。 「ワイド」という名前と、マイクロソフトの用語の残りの部分(「UTF-16」または「UCS」を意味する「Unicode」を意味する)は、最新のUnicode標準が用語を統合する前に選択されました。
Widechartomultibyteでは、Microsoftは「ワイドキャラクターストリング」という単語を使用してUTF-16を意味します。その文脈では、「マルチバイト文字列」と見なされるものは何ですか? UTF-8?
それをエンコードする他のすべて WideCharToMultiByte
サポートは、Windows-1251やUTF-8を含む、このコンテキストでは「マルチバイトエンコード」です。
LPWSTRは「ワイドキャラクターストリング」ですか?私はそれがそうだと言うでしょうが、それはそれがUTF-16であるという意味ではないでしょうか?そして、それはそれがたとえば、4バイトのキャラクターを表示するために使用できるという意味ではないでしょうか?そうでない場合、... 4バイトの文字を表示することは不可能ですか? (WindowsにはAPIがないようです。)
LPWSTR
ポインターです wchar_t
これは常にWindows上の16ビットの署名されていない整数です。どの文字を表示できるかは、エンコードがすべてのUnicode文字をエンコードできる限り、エンコードとは無関係です。 Windowsは通常、BMP以外の文字を表示できますが、どこにでもありません(たとえば、コンソールはできません)。
WideChartomultibyteの機能性はWCSTOMBSのスーパーセットであり、どちらも同じタイプの文字列で動作しますか?または、1つはUTF-16で動作し、もう1つはUCS-2で動作しますか?
本当に知りませんが、私はそれらがあまり違いないとは思いません。非BMP文字をUTF-8に変換して、結果が正しいかどうかを調べようとするだけです。
UTF-16またはUCS-2のファイルパスはありますか? Windowsは、Microsoftのドキュメントの「キャラクターの不透明な配列」として扱っていることを知っていますが、FWPrintfのような関数のC標準に従って、標準化されたエンコードはありますか?
ファイルパスは、実際にはUTF-16文字の不透明な配列です。つまり、ファイル名を保存または読み取りするときにWindowsはいかなる種類の翻訳も実行しません(LinuxやMac OS Xとは異なり)。しかし、Windowsには、同等の扱われているファイル名が必ずしも等しくないため、多くのトラブルを引き起こす奇妙な大部分が定義されているケースの非感受性行動がまだあります。それは多くの不変性を破ります。たとえば、他のスレッドから干渉しないLinuxで、2つのファイルを正常に作成した場合 A
と a
一部のディレクトリでは、2つの異なるファイルが表示されますが、Windowsでは1つのファイルしか取得できません(一般的には予測不可能な数のファイル)。
「ANSI」エンコードとは何ですか?それは正しい用語ですか?そして、それはASCIIとどのように関係していますか?
ANSIはアメリカの標準化組織です。エンコーディングを参照するときにこの単語を使用することは誤称ですが、頻繁なものです。そのため、注意する必要があります。私はこの用語が好きです レガシー8ビットエンコーディング, 、それが本質的にそれが何であるかだと思うからです。レガシー(Windows 9x)アプリケーションとの互換性のためにのみ保持される非ユニコードエンコードです。西洋のシステムでは、これは通常Windows-1252であり、ASCIIの適切なスーパーセットです。
他のヒント
*関数がアクティブなANSIコードページを使用しました。
*w機能UTF-16を使用します。
マルチバイトとは、コードページパラメーターで渡されるものを指します。最も一般的には、アクティブなANSIコードページまたはUTF-8のいずれかです。
LPWSTRはUTF-16文字列です。 MSDN)
私はwcstombsについて何も知りません、私は常にwidechartomultibyteを使用しています。
ファイルパスはUTF-16にあります。実際、すべてのテキストはWindowsで内部的にUTF-16です。
ANSIエンコーディングの場合、それを詳細に読む必要があります。あなたは最初よりも悪いことをすることができます ウィキペディア そこからのリンクに従ってください。
私はそれが役立つことを願っています、そして、私が何か間違ったことを持っているなら、もっと知っている人なら誰でもこれを編集してエラーを修正してください!
かつてはUCS-2でした。 Windows 2000から、広い弦はUTF-16です。古いレガシーシステムを維持する必要があるかどうかを知っておくとよいでしょう。
まず第一に、多くの情報があります これはそうトピックです.
ASCIIはチャーセットであり、エンコードではありません。現在、多くの8ビットの充電器があり、そのうちの1つはシステムでデフォルトとして設定されています(地域設定で変更できます)。 *関数は、そのチャーセットの8ビット文字を受け入れます。 UTF-8はチャーセットではなく、Unicode charsetのエンコードです。 *W機能は、私が理解しているように、UCS-2ではなくUTF-16を使用します。