Windows 7がUTF-8ではなくUnicodeで動作するのはなぜですか?
用語
UnicodeとUTF-8は同じ種類のものではありません。Unicodeは文字セット(レパートリー)を定義し、それらの各文字に番号(コードポイント)を割り当てる文字セットです。UTF‑8は、ディスク上または送信中のUnicode文字のストリームを表すために使用できるいくつかのエンコーディングの 1つです。Unicode文字の同じストリームは、たとえばUTF‑16、UTF‑32またはUTF‑7としてエンコードすることもできます。
しかし、メモ帳はあなたが含むオプション「をコード」提供していますANSI
、Unicode
、Unicode big-endian
とUTF-8
。これを書いたマイクロソフトの開発者は、間違った用語を使用しています。「Unicode」と言うとき、「UTF-16
リトルエンディアン」を意味する可能性が高いです。「ANSI」と言うときは、コードページ1252(CP-1252)を意味します。
Microsoftメモ帳
Microsoftのメモ帳は、バイトオーダーマーク(BOM)を使用してUTF-16を書き込み、メモ帳はテキストファイルを読み取るときにBOMを検索すると考えています。BOMは、ファイルがUTF-16であることをアプリに通知し、ビッグエンディアンかリトルエンディアンかを示します。
NotepadがBOMを見つけられない場合、ライブラリ関数を呼び出しますIsTextUnicode
。この関数はデータを調べ、使用されたエンコードを推測しようとします。時々(必然的に)誤った推測をします。「ANSI」ファイルが「Unicode」であると推測される場合があります。UTF-16またはUTF-8ファイルをコードページ1252として解釈しようとすると、間違ったグリフが表示され、8ビット値を表示するグリフを見つけることができなくなります。これらは正方形として表示されます。
harrymcが答えで述べているように、メモ帳に代わるより良い選択肢があります。ただし、メモ帳を使用すると、ファイルを開くときにエンコードを明示的に選択できます(メモ帳から推測しようとするのではなく)。
バイトオーダーマーク
Unicodeコンソーシアムによると、バイトオーダーマーク(BOM)はオプションです。ただし、Windowsは一部のエンコーディングを区別するためにBOMに依存しています。
要するに、何らかの理由でファイルにBOMが欠けていたのでしょうか?アップグレードプロセス中にBOMが失われた可能性がありますか?
正方形として表示される元のファイルがまだある場合は、それらの16進ダンプを作成して、BOMが含まれているかどうかを確認できます。
プレーンテキストファイルの標準
問題は、事実上何もないということです。プレーンテキストファイルの普遍的な標準はありません。代わりに、多くの非互換性と未知のものがあります。
行末はどのようにマークされていますか?プラットフォームによっては、改行文字(LF)が後に続く制御文字の復帰(CR)を使用するものもあれば、CRのみを使用するものとLFのみを使用するものもあります。
上記のターミネーターまたはセパレーターですか?これはファイルの終わりに影響を及ぼし、問題を引き起こすことが知られています。
タブおよびその他の制御文字の処理。行の先頭から8つの倍数の標準文字幅に揃えるためにタブが使用されると仮定するかもしれませんが、実際にはこれには確実性がありません。多くのプログラムでは、タブの位置を変更できます。
文字セットとエンコード?これらのどれがファイルのテキストに使用されたかを示すための普遍的な標準はありません。最も近い方法は、エンコードがUnicodeに使用されるものの1つであることを示すBOMの存在を探すことです。BOM値から、ファイルを読み取るプログラムはUTF-8とUTF-16など、およびUTF-16のリトルエンディアンとビッグエンディアンのバリアントなどを区別できます。ファイルがCP-1252やKOI-8などの他の一般的なエンコードでエンコードされます。
等々。上記のメタデータはいずれもテキストファイルに書き込まれないため、エンドユーザーはファイルを読み取るときにプログラムに通知する必要があります。エンドユーザーは、特定のファイルのメタデータ値を知っているか、プログラムが間違ったメタデータ値を使用するリスクを実行する必要があります。
ブッシュは事実を隠した
Windows XPでこれを試してください。
- メモ帳を開きます。
- フォントをArial Unicode MSに設定します。(最初にインストールする必要がある場合があります。メニューに表示されない場合は、[Show more fonts]をクリックしてください。)
- 「ブッシュは事実を隠した」というテキストを入力します。
- を選択し
Save As
ます。Encoding
メニューを選択ANSI
。
- メモ帳を閉じます。
- (使用して、例えば文書を再度開き
Start
、My Recent Documents
)。
- 「ブッシュが事実を隠した」の代わりに畂桳栠摩琠敨映捡獴が表示されます。
これは、IsTextUnicode
メモ帳で使用される関数がANSI(実際にはコードページ1252)テキストがBOMのないUnicode UTF-16LEであると誤って推測することを示しています。として保存されたファイルにBOMはありませんANSI
。
Windows 7
Windows 7ではIsTextUnicode
、上記のことが起こらないようにMicrosoftが調整しました。BOMがない場合、Unicode(UTF-16LE)よりもANSI(CP 1252)を推測する可能性が高くなりました。Windowsの-7で、私はあなたがそのためです期待より可能性の高い逆の問題持っている:255より大きいコードポイントでUnicode文字を含むファイルを、ないBOMで、今より多くの可能性が高いANSIとして推測される-ので、間違って表示しました。
エンコードの問題を防ぐ
現在、最善のアプローチはどこでもUTF-8を使用することです。理想的には、すべての古いテキストファイルをUTF-8に再エンコードし、テキストファイルをUTF-8としてのみ保存します。これに役立つrecodeやiconvなどのツールがあります。