web-dev-qa-db-ja.com

Windows 7 UTF-8およびUnicode

Windows 7(Pro 64ビット)の変更点を誰かが説明してもらえますか?

詳細:以前はWindows XPで、CSV形式のいくつかの翻訳ファイル(UTF-8エンコード)がありました。フォントをメモ帳とExcelの両方で表示できました。Windows7にアップグレードした後これらのファイルを開くと、四角いボックスだけが表示されます(ブラウザーで開くとわかりますが、すべての翻訳を見ることができました)。これらのファイルをUnicodeで保存すると、すべて問題ないようです。

それで、正確には何が起こっているのですか? Windows 7がUTF-8ではなくUnicodeで動作するのはなぜですか?

14
Sha Le

Windows 7がUTF-8ではなくUnicodeで動作するのはなぜですか?

用語

nicodeTF-8 は同じ種類ではありません。Unicodeは文字セット文字のセット(レパートリー)を定義し、それらの各文字に番号(コードポイント)を割り当てます。 UTF‑8は、representに使用できるいくつかのエンコーディングの1つですディスク上または転送中のUnicode文字のストリーム。同じUnicode文字のストリームを、たとえばUTF-16、UTF32、またはUTF-7としてエンコードすることもできます。

ただし、メモ帳には、ANSIUnicodeUnicode big-endianUTF-8などの「エンコード」オプションが用意されています。これを書いたマイクロソフトの開発者は間違った用語を使用しています。彼らが「Unicode」と言うとき、彼らはおそらく「 TF-16little-endian "を意味します。彼らが「ANSI」と言うとき、それらは コードページ1252 (CP-1252)を意味します。

Microsoftメモ帳

Microsoftのメモ帳はバイトオーダーマーク( [〜#〜] bom [〜#〜] )でUTF-16を書き込み、メモ帳はテキストファイルを読み取るときにBOMを探すと思います。 BOMは、ファイルがUTF-16であることをアプリに通知し、ファイルがビッグエンディアンかリトルエンディアンかを示します。

BOMが見つからない場合、メモ帳はライブラリ関数 IsTextUnicode を呼び出します。これは、データを調べて、使用されたエンコーディングを推測しようとします。時々(必然的に)間違って推測する。 「ANSI」ファイルが「Unicode」であると推測する場合があります。 UTF-16またはUTF-8ファイルをコードページ1252として解釈しようとすると、誤ったグリフが表示され、一部の8ビット値をレンダリングするためのグリフを見つけることができなくなります。これらは正方形として表示されます。

彼の答え でハリーマックが言うように、メモ帳に代わるより良い選択肢があります。ただし、メモ帳では、ファイルを開くときにエンコードを明示的に選択できます(メモ帳を離れて推測するのではなく)。

バイトオーダーマーク

Unicodeコンソーシアムによれば、バイトオーダーマーク(BOM)はオプションです。ただし、Windowsは一部のエンコーディングを区別するためにBOMに依存しています。

つまり、何らかの理由でファイルにBOMが不足しているのではないでしょうか。アップグレードプロセス中にBOMが失われた可能性がありますか?

正方形として表示される元のファイルがまだある場合は、それらの16進ダンプを作成して、BOMが含まれているかどうかを確認できます。


プレーンテキストファイルの標準

問題は、実質的にnoneが存在することです。プレーンテキストファイルの一般的な標準はありません。代わりに、多くの非互換性と未知のものがあります。

  • 行末はどのようにマークされていますか?一部のプラットフォームでは、制御文字のキャリッジリターン(CR)に続いてラインフィード(LF)を使用し、CRのみを使用するプラットフォームと、LF=のみを使用するプラットフォームがあります。

  • 上記のターミネーターまたはセパレーターですか?これはファイルの最後に影響し、問題を引き起こすことがわかっています。

  • タブおよびその他の制御文字の扱い。行の先頭から8の倍数の標準文字幅に揃えるためにタブが使用されていると想定するかもしれませんが、実際にはこれに確実性はありません。多くのプログラムでは、タブの位置を変更できます。

  • 文字セットとエンコーディング?これらのどれがファイル内のテキストに使用されているかを示すための普遍的な標準はありません。最も近いのは、エンコーディングがUnicodeで使用されているものの1つであることを示すBOMの存在を探すことです。 BOM値から、ファイルを読み取るプログラムは、UTF-8とUTF-16など、およびUTF-16のリトルエンディアンとビッグエンディアンのバリアントなどを区別できます。ファイルであることを示すための普遍的な標準はありません。 CP-1252やKOI-8などの他の一般的なエンコーディングでエンコードされます。

等々。上記のメタデータはいずれもテキストファイルに書き込まれないため、エンドユーザーはファイルを読み取るときにプログラムに通知する必要があります。エンドユーザーは、特定のファイルのメタデータ値を知っているか、プログラムが誤ったメタデータ値を使用するリスクを負わなければなりません。

ブッシュは事実を隠した

Windows XPでこれを試してください。

  • メモ帳を開きます。
  • フォントをArial Unicode MSに設定します。 (最初にインストールする必要がある場合があります。メニューに表示されない場合は、[他のフォントを表示]をクリックしてください。)
  • 「ブッシュは事実を隠した」というテキストを入力します。
  • Save Asを選択します。 EncodingメニューからANSIを選択します。
  • メモ帳を閉じます。
  • ドキュメントを再度開きます(例:StartMy Recent Documentsを使用)。
  • 「ブッシュは事実を隠した」の代わりに畂桳栠摩琠敨映捡獴を見るでしょう。

これは、メモ帳で使用されるIsTextUnicode関数が、ANSI(実際にはコードページ1252)テキストがBOMのないUnicode UTF-16LEであると誤って推測していることを示しています。 ANSIとして保存されたファイルにはBOMがありません。

Windows 7

Windows 7では、上記が発生しないようにIsTextUnicodeを調整しました。 BOMがないと、Unicode(UTF-16LE)よりもANSI(CP 1252)を推測する可能性が高くなります。したがって、Windows 7では、more逆の問題が発生する可能性が高いと考えています。255を超えるコードポイントを持つUnicode文字を含むが、 BOMはANSIであると推測される可能性が高くなり、そのため正しく表示されません。

エンコードの問題の防止

現在、最善の方法は、どこでもUTF-8を使用することです。理想的には、すべての古いテキストファイルをUTF-8に再エンコードし、テキストファイルをUTF-8として保存するだけです。これに役立つ recodeiconv などのツールがあります。

30
RedGrittyBrick

備考: Notepad ++ を使用して、Encodingメニューからこれらのファイルを表示できます。

ファイルが正しく表示されたら、ファイルを保存すると正しいBOMが追加されます。

3
harrymc

Windows 10では可能です(1903ビルドでテスト)

  1. 適切なエンコーディングでファイルをコピーしますTXTUTF-8.txtからC:\WINDOWS\SHELLNEW
  2. HKEY_CLASSES_ROOT\.txt\ShellNew "FileName"という名前の新しいチェーンを作成します
  3. FileName」の値を「TXTUTF-8.txt "

これで、Windowsメニューを使用して新しいtxtファイルを作成すると、TXTUTF-8.txtテンプレートとして

出典: https://answers.Microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3- 43e8-a154-d10c1fe94317

1
e2dy Dev