ブラウザにデータを送信するときに PHP が使用するエンコーディングを知るにはどうすればよいですか? つまり、たとえば、iso-8859-1 などの Cotent-Type ヘッダーを使用します。
6 に答える
William が提案した header() ソリューションを使用できますが、Apache を実行していて、Apache 構成がデフォルトの文字セットを使用している場合は、常に優先されます (Internet Explorer はおかしくなります) 参照: AddDefaultCharset
コンテンツ タイプとエンコーディングは 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");
通常、ウェブホスティング業者の Apache + PHP サーバーはNOcharset
ヘッダーを送信するように設定されています。サーバーがどのように構成されているかをテストする最短の方法は次のとおりです。
- このツールを使用して、Web サイト上のいずれかのページを取得してサーバー ヘッダーを表示します。サーバーヘッダーに a が表示されている場合、
charset
サーバーがそれを使用していることを意味します。通常、charset
. - もう 1 つの方法は、サーバーでこの単純なスクリプトを実行することです。
<?php echo ini_get('default_charset'); ?>
上記のように、これは通常、空の文字列を出力します。異なる場合charset
は、PHP の .
2番目の解決策は、Apacheが構成されAddDefaultCharset some_charset
ていないことを前提としていますが、これは通常はそうではありませんが、そのような場合、Apacheの設定がPHPのdeafult_charset iniディレクティブをオーバーライドする可能性があるのではないかと心配しています.
サーバーがデフォルトのコンテンツまたは文字セットを持つように構成されておらず、PHP も構成されていない場合、PHP は送信のみをContent-Type: text/html
行います - 文字セットをまったく指定せず、スクリプトで見たとおりにバイトを送信します。
ブラウザが文字セットが指定されていないページを受信すると、さまざまなことが発生する可能性があります。
- ほとんどのブラウザーには「エンコード/文字セット」メニューがあります。ユーザーが明示的に選択すると、ブラウザーはそれを適用しようとします。あまり頻繁に発生しないため、次のようになります。
- 一部のブラウザーは、デフォルトの文字セットでレンダリングしようとします (これはロケールに依存します。たとえば、FF と cs_CZ の場合
iso-8859-2
、以前は YMMV でした)。 - IE はヒューリスティックに文字セットを決定しようとします (文字の分布に基づいて推測します。多くの場合、正しくなります。時には間違って、ルーマニア語のページが中国語のテキストとして解釈されます。これは通常、「判読不能」を意味します)。 ")
- 一部の古いブラウザはフォールバックします
us-ascii
この手順で、PHP スクリプトの文字セットとブラウザの文字セットが一致すると、誤ってテキストが読み取れるようになります。そうでない場合、奇妙な兆候や同様の現象が発生します。
で独自に設定できますがheader('Content-type: xxx/yyy');
、デフォルトでは text/html が送信されると思います。
私の知る限り、PHPは文字列をバイトごとに送信します。つまり、変数が UTF-8 を保持している場合、UTF-8 を送信します。iso-8859-1 がある場合は、それも送信されます。それらを混ぜると、きれいになりません。