PHP:ブラウザにデータを送信するために使用されている現在のエンコーディング
-
02-07-2019 - |
質問
データをブラウザに送信するときに PHP で使用されるエンコーディングを確認するにはどうすればよいですか?つまり、Cotent-Type ヘッダーを使用すると、次のようになります。iso-8859-1。
解決
通常、ウェブホスターの Apache + PHP サーバーは、 いいえ charset
ヘッダ。サーバーの構成をテストする最も簡単な方法は次のとおりです。
- 使用 サーバーヘッダーを確認するためのツール Web サイト上のいずれかのページを取得することによって。サーバーヘッダーに
charset
これはサーバーがそれを使用していることを意味し、通常は含まれませんcharset
. - もう 1 つの方法は、サーバー上で次の単純なスクリプトを実行することです。
<?php echo ini_get('default_charset'); ?>
上で述べたように、これは通常空の文字列を出力しますが、異なる場合は、charset
PHPの。
2 番目の解決策は、Apache が次のように構成されていないことを前提としています。 AddDefaultCharset some_charset
通常はそうではありませんが、そのような場合、Apache 設定が PHP deafult_charset ini ディレクティブをオーバーライドする可能性があると思います。
他のヒント
William が提案した header() ソリューションを使用することもできますが、Apache を実行していて、Apache 構成がデフォルトの文字セットを使用している場合は、毎回それが勝ちます (Internet Explorer がおかしくなります)。以下を参照してください。 デフォルト文字セットの追加
コンテンツ タイプとエンコーディングは 2 つの異なるものであることに留意してください。text/html はコンテンツ タイプです。ISO-8859-1 と UTF-8 はエンコーディングです。
サーバーが送信する HTTP 応答ヘッダーは通常、次のようになります。
Content-Type: text/html; charset=utf-8
「charset」は実際には文字エンコーディングです。別個のヘッダーにはありません。ただし、実際に応答で使用される圧縮の種類を指定する「Content-Encoding」と呼ばれるヘッダーがあります (例:gzip)。
HTML を含むファイルで文字エンコードを UTF-8 に変更する場合は、次のようにします。
<?
header("Content-Type: text/html; charset=utf-8");
独自に設定できます header('Content-type: xxx/yyy');
, しかしデフォルトではtext/htmlが送信されると思います。
私の知る限り、PHPは文字列をバイト単位で送信します。つまり、変数に UTF-8 が含まれている場合は、UTF-8 が送信されます。iso-8859-1 を持っている場合は、それも送信されます。混ぜると綺麗にならないよ。
サーバーがデフォルトのコンテンツまたは文字セットを持つように構成されておらず、PHP も構成されていない場合、PHP は Content-Type: text/html
- 文字セットをまったく指定せず、スクリプト内で認識されたとおりにバイトを送信します。
ブラウザが文字セットが指定されていないページを受信すると、さまざまなことが起こる可能性があります。
- ほとんどのブラウザには「エンコーディング/文字セット」メニューがあります。ユーザーが明示的に選択すると、ブラウザはそれを適用しようとします。あまり頻繁に起こることではないので、次のようになります。
- 一部のブラウザは、デフォルトの文字セット (ロケールに依存します。例:FF と cs_CZ では以前はそうでした
iso-8859-2
;YMMV) - IE は、文字セットをヒューリスティックに決定しようとします (文字の分布に基づいて推測が行われますが、多くの場合、正しく決定されます)。時々間違って、ルーマニア語のページが中国語のテキストとして解釈されてしまいます。これは通常「読めない」という意味です)
- 一部の古いブラウザはフォールバックします
us-ascii
この手順で PHP スクリプトの文字セットとブラウザの文字セットが一致すると、テキストが - 偶然 - 読めるようになります。そうでなければ、奇妙な兆候や同様の現象が発生するでしょう。