UTF-8 ファイルの Unicode 署名 BOM (バイト オーダー マーク) の問題

UTF-8 ファイルの Unicode 署名 BOM (バイト オーダー マーク) の問題


最近、UTF8 エンコードの中国語 Zen Cart Web サイトをデバッグしているときに奇妙な現象に遭遇しました。Web ページ上のテキストは正常に表示されましたが、IE を使用してソース ファイルを表示すると (メモ帳で開きます)、文字化けが発生しました。Firefox ではこの問題は発生しませんでした。オンラインで何度も検証とテストを行った結果、問題は解決しました。実際には、UTF-8 ファイルの Unicode 署名 BOM (バイト オーダー マーク) に問題がありました。

BOM (Byte Order Mark) は、UTF エンコード方式でエンコードを識別するために使用される標準マークです。UTF-16 では、元々は FF FE でしたが、UTF-8 では EF BB BF になります。このフラグはオプションであり、UTF8 バイトには順序がないため、バイト ストリームが UTF-8 でエンコードされているかどうかを検出するために使用できます。 Microsoft はこの検出を行いますが、一部のソフトウェアでは検出が行われず、通常の文字として扱われます。

Microsoft は、独自の UTF-8 テキスト ファイルの前に EF BB BF の 3 バイトを追加します。Windows のメモ帳などのプログラムは、この 3 バイトを使用して、テキスト ファイルが ASCII か UTF-8 かを判断します。ただし、これは Microsoft が秘密裏に付けたマークにすぎません。他のプラットフォームには、UTF-8 テキスト ファイル用のこのようなマークはありません。

つまり、UTF-8 ファイルには BOM がある場合とない場合があり、それらをどのように区別すればよいのでしょうか? 3つの方法。 1. UltraEdit-32 でファイルを開き、16 進編集モードに切り替えて、ファイル ヘッダーに EF BB BF があるかどうかを確認します。 2. Dreamweaver で開き、ページのプロパティを確認し、「Unicode 署名 BOM を含める」の前にチェックマークが付いているかどうかを確認します。 3. Windows のメモ帳でファイルを開き、「名前を付けて保存」を選択して、ファイルのデフォルトのエンコードが UTF-8 か ANSI かを確認します。ANSI の場合は、BOM は含まれません。

Zen Cart テンプレート ファイルで html_header.php を見つけましたが、ファイルに BOM がないことがわかりました。UltraEdit-32 で保存し、BOM を追加してから html_header.php をアップロードしました。すべて正常でした。

Convertz を使用して gb2312 ファイルを UTF-8 ファイルに変換する場合、デフォルト設定では BOM が含まれないことに注意してください。上記の文字化けは、BOM がない場合でも表示されることがあります。ただし、BOM が含まれている場合、PHP のインクルード ファイルでは、PHP バイト ストリームの前に EF BB BF が追加されるため、事前にディスプレイに出力しておくとプログラム エラーの原因になることがあります。 1 つの解決策は、含まれるすべてのファイルを ANSI として保存し、メイン ファイルを UTF-8 にすることです。ファイルから BOM を削除するには、ファイルを UlterEdit で開き、16 進編集モードに切り替えて、最初の 3 バイト (EF BB BF) を 20 に置き換え、ファイルを保存し (保存時に自動バックアップ機能をオフにすることに注意してください)、デフォルトの編集モードに切り替えて最初の 3 つのスペースを削除します。

また、エンコードに関するちょっとした知識も学びました。いわゆる Unicode で保存されたファイルは実際には UTF-16 であり、これは Unicode コードと同じものですが、概念的には Unicode と UTF は 2 つの異なるものです。Unicode はメモリエンコード表現スキームであり、UTF は Unicode を保存および転送するためのスキームです。 UTF-16 は、上位バイト先頭 (LE) と上位バイト最後 (BE) の 2 つのタイプに分かれています。公式の UTF エンコーディングには UTF-32 も含まれており、これも LE と BE に分かれています。非 Unicode 公式 UTF エンコーディングには、主に電子メールの送信に使用される UTF-7 も含まれます。 utf-8 のシングルバイト部分は iso-8859-1 と互換性があります。これは主に、一部の古いシステムとライブラリ関数が utf-16 を正しく処理できず、強制的に排除されるためです。英語の文字の場合、ファイル スペースも節約されます (英語以外の文字のスペースを無駄にする代わりに)。 iso-8859-1 を使用する場合、utf8 と iso-8859-1 は両方とも 1 バイトで表されます。他の文字を表す場合、utf-8 は 2 バイトまたは 3 バイトを使用します。

<<:  Mysql-connector-java ドライバのバージョン問題の概要

>>:  Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現

推薦する

MySQL インデックスの使用方法 (単一列インデックスと複数列インデックス)

1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...

MySQL で union all を使用してユニオンソートを取得する方法

プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たす...

MySQL の列から行への変換、フィールドの結合方法 (必読)

データシート:列から行へ: max(case when then) を使用max---集計関数は最大...

Vueでデータ例を定義する方法

序文開発プロセスにおいて、変数の定義は非常に頻繁かつ基本的なタスクです。変数の使用シナリオと範囲に応...

Linux DMAインターフェースの知識ポイントの詳細な説明

1. 2種類のDMAマッピング1.1. 一貫性のあるDMAマッピング主に長期間使用されるエリアをマッ...

「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

最近、たまたまこの小さな要件に遭遇しました。昔、JS を使用してこれを処理したことを覚えていますが、...

Vueライフサイクルカメラの8つのフック関数

目次1. beforeCreateとcreated関数2. beforeMountとmount関数3...

MySQL データベースの最適化: インデックスの実装原則と使用状況の分析

この記事では、例を使用して、MySQL データベースの最適化のためのインデックス実装の原則と使用方法...

「fsck」を使用して Linux のファイルシステムエラーを修正する方法

序文ファイル システムは、データの保存方法と復元方法を整理する役割を担います。 いずれにせよ、時間の...

Vue バックグラウンドでステータス ラベルをエレガントに記述する例

目次序文最適化変数の抽出二次包装 el-tag コンポーネント使用要約する序文バックエンドシステムの...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

MySQLスローログクエリの詳細な説明

遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...

CSS の両端揃えを実現する div+css レイアウトの 4 つの方法の概要

2 端揃えを実現する div+css レイアウトは、Web ページの組版でよく使用されます。この記事...

MySQL での replace と replace into の使い方の説明

MySQL の replace と replace into はどちらも頻繁に使用される関数です。r...

中国における中国語ドメイン名の人気は新たなクライマックスを迎えた

<br />外交部などの中央政府機関、各レベルの地方政府、その他の国家機関や部門が率先し...