16

同じ Unicode (標準化された)テーブルの異なるエンコーディングがあります。たとえば、UTF-8 エンコーディングの場合A は に対応し 0x0041ますが、UTF-16 エンコーディングの場合Aとして表され 0xfeff0041ます。

この素晴らしい記事から、Windows プラットフォーム用に C++ でプログラミングし、Unicode を扱う場合、Unicode が 2 バイトで表されることを知っておく必要があることを学びました。しかし、エンコーディングについては何も述べていません。(x86 CPU はリトル エンディアンであると言われているので、これらの 2 バイトがメモリに格納される方法を知っています。) しかし、シンボルがメモリに格納される方法に関する完全な情報を得るために、Unicode のエンコーディングも知っておく必要があります。C++/Windows プログラマ向けの固定 Unicode エンコーディングはありますか?

4

1 に答える 1

20

Windows のメモリに格納される値は、常に UTF-16 リトル エンディアンです。しかし、それはあなたが話していることではありません-ファイルの内容を見ています。Windows 自体はファイルのエンコーディングを指定せず、個々のアプリケーションに任せます。

ファイルの先頭にある 0xfe 0xff は、バイト オーダー マークまたは BOMです。ファイルがおそらく Unicode であることを示すだけでなく、Unicode エンコーディングのバリアントを示します。

0xfe 0xff      UTF-16 big-endian
0xff 0xfe      UTF-16 little-endian
0xef 0xbb 0xbf UTF-8

BOM を持たないファイルは、それがどのように書かれたかを知らない限り、8 ビット文字であると見なされるべきです。それが UTF-8 なのか、それとも他の Windows 文字エンコーディングなのかはまだわかりません。推測する必要があります。

これを行う方法の例として、メモ帳を使用できます。ファイルに BOM がある場合、メモ帳はそれを読み取り、コンテンツを適切に処理します。それ以外の場合は、[エンコード] ドロップダウン リストを使用して自分でコーディングを指定する必要があります。

編集: Windows のドキュメントがエンコーディングについてより具体的でない理由は、Windows が Unicode の非常に初期の採用者であり、当時はコード ポイントあたり 16 ビットのエンコーディングが1 つしかなかったためです。65536 個のコード ポイントでは不十分であると判断されたとき、範囲を拡張する方法としてサロゲート ペアが発明され、UTF-16 が誕生しました。Microsoft は既に Unicode を使用してエンコーディングを参照しており、変更されることはありませんでした。

于 2012-11-21T18:54:23.550 に答える