通常、Web ページ上で指定したエンコードでテキストを表示できるように、Web ページでは GB2312、UTF-8、ISO-8859-1 などのエンコード文字セットを指定する必要があります。しかし、この状況に遭遇する可能性は高くなります。つまり、ISO-8859-1 でエンコードされた Web ページに中国語の文字を表示したり、GB2312 でエンコードされた Web ページに韓国語の文字を表示したりする必要がある場合があります。もちろん、解決策の 1 つは、ISO-8859-1 や GB2312 エンコードを使用せず、UTF-8 エンコードを使用することです。これを使用する限り、さまざまな国の言語を混合して表示できます。これは現在多くの Web サイトで使用されている方法です。
ここで話しているのは上記の方法ではありません。なぜなら、上記の方法では文字セットを UTF-8 として指定する必要があるためです。ユーザーが手動で他の文字セットを指定した場合、または何らかの理由でその文字セットが指定されなくなるからです。この設定が機能せず、ブラウザが自動的に正しく認識しない場合、特にフレームで作成された一部の Web ページでは、表示される Web ページが文字化けします。フレーム内のページの文字セット設定が機能しない場合、表示されるWebページはまだ文字化けしていますが、Firefoxでは文字化けが表示され、変更できません(つまり、RightEncodeプラグインをインストールしないと)。
ここで紹介する方法は、Web ページが ISO-8859-1 文字セットに指定されている場合でも、中国語や日本語などを正しく表示できます。原理は非常に単純です。つまり、ISO-8859-1 エンコーディングの最初の 128 文字を除く他のすべてのエンコーディングは NCR (数値文字参照) で表されます。たとえば、「漢字」という 2 つの文字を「漢字」の形式で書くと、どの文字セットでも正しく表示できます。この原則に基づいて、既存の Web ページを任意の文字セットで表示できる Web ページに変換できる次のプログラムを作成しました。ソース Web ページの文字セットとソース Web ページを指定し、送信ボタンをクリックするだけで、ターゲット Web ページが取得されます。特定のテキストのみを変換することもできます。テキスト ボックスにテキストを入力し、そのテキストの元の文字セットを指定するだけで、エンコードされたテキストがページに表示されます。さらに、WordPress プラグインも作成し、どの文字セットでもブログが正しく表示されるようになりました。
実装方法:
最初のステップは、ソース文字セットの文字列を UTF-16 文字セットに変換することです。このステップは、UTF-16 文字セットの各文字のために実行されます。これらはすべて 2 バイトなので、後で処理するのは簡単ですが、ソース文字セットを直接処理するのは非常に複雑です。ソース文字セットは、元の Web ページのメタ タグから取得することも、個別に指定することもできます。これは、ユーザーが送信したファイルが必ずソース文字セットであることを保証できないため、ユーザーがフォームでソース文字セットを指定できるようにするためです。 HTML ファイルである必要があります (他のファイルについても同様です)。はい、たとえば、WordPress の中国語パッケージのソース ファイルは po ファイルであり、その中のコンテンツもこの方法で処理できます)。 HTML ファイルには文字セットを指定するためのメタ タグが必ずしも含まれていないため、文字セットはフォームを通じて個別に指定されます。ある文字セットを別の文字セットに変換するのは実際には非常に面倒だと思うかもしれませんが、PHP にはそのような機能が既に含まれているため、さまざまな文字セット間の変換を簡単に行うことができます。 iconv 拡張機能がマシンにインストールされていない場合は、基本的に何もできないため、mb_convert_encoding 関数を使用することもできます。一流の専門家でない限り、非常に多くの種類のコードを自分で変換する必要があります。 iconv の方が効率的で、より多くの文字セットをサポートしているため、iconv を使用することをお勧めします。
上記のステップが完了したら、次のステップは文字列を 2 バイト単位で処理することです。これら 2 バイトは直接数値に変換され、xxxx; の xxxxx になります。数値が 128 未満の場合は、この文字を直接使用します (ここでは 1 バイトになることに注意してください)。それ以外の場合は、xxxx; の形式を使用します。 。ここで注意すべき点は、この数値が 65279 (16 進数の 0x FEFF) の場合は無視してください。これは Unicode エンコードにおける送信制御文字であり、現在の文字列にはすでに最初の 128 文字が iso-8859 -1 のみエンコードされているためです。文字なので必要ありません。
基本的な考え方は次のとおりです:
以下は引用内容です:
$str = iconv($encode, "UTF-16BE", $str); i = 0; $i if ($code <128) { $output .= chr($code) } else if ($code != 65279) { $output .= "".$code.";"; } } return $output; ?> |