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 ダイナミック ロゴ効果を実現

推薦する

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

JavaScript でアルゴリズムの複雑さを学ぶ方法

目次概要Big O 表記法とは何ですか?オー(1)の上) (n^2) O(logn) ですの上!)結...

Vueカスケードドロップダウンボックスの設計と実装

目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...

MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル (Linux)

この記事では、Linux MySQL 8.0.18のインストールと設定のグラフィックチュートリアルを...

mysql 簡単な操作例を表示

この記事では、例を挙げて mysql show 操作について説明します。ご参考までに、詳細は以下の通...

WindowsでMysql5.7.17のインストールと起動に失敗する問題を解決する

マシンに初めて MySQL をインストールします。オペレーティングシステムはwin7ですmysqlの...

HTML に FLASH へのリンクを追加し、すべての主要ブラウザと互換性を持たせる方法

まずコードを見てみましょうコードをコピーコードは次のとおりです。 <div style=&qu...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

Trash-Cli: Linux のコマンドラインごみ箱ツール

ゴミ箱は Linux ユーザー、Windows ユーザー、Mac ユーザーにとって非常に一般的なので...

IP アドレス経由で MySql にアクセスする方法

1. mysqlにログインします。 mysql -u ルート -h 127.0.0.1 -p 2. ...

mysqlは複数の主キーを設定する操作を実装します

ユーザーテーブル、ID番号は一意である必要があります、携帯電話番号、電子メールアドレスは一意である必...

JavaScriptタイマーの詳細な説明

目次簡単な紹介間隔の設定説明するパラメータ戻り値使用法タイムアウトの設定説明するパラメータ使用法:タ...

Docker ベースの Jenkins のデプロイに関する詳細なチュートリアル

このドキュメントを作成した当時は2019年12月頃で、er2.200が最新バージョンでした。 1.画...

DockerでJenkinsをインストールし、初期プラグインのインストール失敗の問題を解決する

Jenkins をインストールした後、プラグインの初期ダウンロードが常に失敗し、インストールが失敗し...

シェルを使用してMySQLデータバックアップスクリプトを作成する

アイデアそれは実はとても簡単ですシェル スクリプトを記述して、mysql の mysqldump を...