W3Cバリデーターで有効なPHPを使用してHTTPヘッダーをUTF-8に設定する方法


319

次のコードを使用して、さまざまなものをHTMLページにエコーするいくつかのPHPページがあります。

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

ただし、W3Cバリデーターを使用して検証すると、次のようになります。

HTTPヘッダー(iso-8859-1)で指定された文字エンコードが、要素(utf-8)の値と異なります。

私はPHPを初めて使用するので、PHPファイルのヘッダーをHTMLファイルと一致するように変更できるかどうか、また変更すべきかどうか疑問に思っていました。

回答:


897

headerHTTPヘッダーを変更するために使用します。

header('Content-Type: text/html; charset=utf-8');

出力がクライアントに送信される前に、この関数を呼び出すことに注意してください。それ以外の場合は、ヘッダーも送信されているため、明らかにヘッダーを変更することはできません。で確認できheaders_sentます。詳細については、のマニュアルページをheader参照してください。


4
このようにHTTPヘッダーを正しく設定すると、<meta>タグは不要になります。
Jon

3
@ジョン:私は両方を使います。METAHTML文書がHTTP経由で(たとえばディスクから)ロードされない場合は、HTTP相当が使用されます。
Gumbo

6
これは、phpを実行している場合にのみ機能します。静的なページに対してそれを行うには、htmlファイルをutf-8として保存する必要があります。これにより、エンコードされたBOM文字utf-8がファイルの先頭に追加されます。バイト0xEF、0xBB、0xBFがファイルの先頭に追加されました。ほとんどのWebサーバーはこれに気づき、適切なヘッダーを適用します。実際、phpファイルをutf-8として保存しても、同じ結果が得られます。
Rahly、

1
@Jeremy Walton:UTF-8 BOMが追加されるとは限りません。実際、UTF-8には1バイトオーダーしかないため、UTF-8の必要はありません(ただし、UTF-8の識別に使用できます)。
Gumbo

1
@ガンボ:確かに、私はここを簡略化し、はるかに一般的なWebシナリオをターゲットにしています(このシナリオについての質問のようです)。質問の見かけのレベルを考慮して、いつかそれがもたらすかもしれない利点が何であるかを理解していないのに、なぜ何かをするのですか?
Jon


15

これは、定義したものと一致しないHTTPヘッダーを送信するWebサーバーの問題です。サーバーに正しいヘッダーを送信させる方法については、こちらのページをご覧ください

それ以外の場合は、PHPを使用してヘッダーを変更することもできますが、次のコードを使用してテキストを出力するに行う必要があります。

header('Content-Type: text/html; charset=utf-8');

PHPを使用してヘッダーを送信する方法の詳細については、ヘッダー関数のドキュメントをご覧ください。


12

より短い方法を使用することもできます:

<?php header('Content-Type: charset=utf-8'); ?>

RFC 2616を参照してください。文字セットのみを指定することは有効です。


私はこのオプションが好きです。なぜなら、コンテンツタイプの他の部分を個別に設定できるからです(たとえば、いくつかのtext / plainページといくつかのtext / htmlページがありますが、すべてUTF8です)。私の理解は正しいですか?
Eric Seastrand、2015年

1
そのように指定することは有効であるというRFC 2616の部分が見つかりません。Content-Type = "Content-Type" ":" media-typeおよびmedia-type = type "/" subtype *( ";" parameter )
AI0867

1
文字セットのみを指定することはできません。RFC 2616(旧式です)やRFC 7231(旧式ではない)、その他のRFCでは無効です。stackoverflow.com/questions/41994062/…を
sideshowbarker

10

正しく実装するには、一連のことを変更する必要があります。

データベース(接続直後):

mysql_query("SET NAMES utf8");

// Meta tag HTML (probably it's already set): 
meta charset="utf-8"
header php (before any output of the HTML):
header('Content-Type: text/html; charset=utf-8')
table-rows-charset (for each row):
utf8_unicode_ci

4
データがユーザーに返される前に、PHPで使用するように構成されたネイティブ形式にデータがエンコードされるため、データベースの連携はPHPによって生成される出力に影響を与えません。第二に、OPはMySQLを使用していると述べていません。3番目に、MyISAMは古くなっていて、何をしているのかを知らない限り推奨されるべきではありません。InnoDBが新しいデフォルトになったのには理由があります。
EWit 2014

最後に、文字エンコーディングを設定するためのすべての場所の完全なリストです。
Filip OvertoneSinger Rydlo 2015年

mysql_query( "SET NAMES utf8"); 私の選択クエリが私のために問題を修正する前に。ありがとう:)
Deepak Goswami 2016年

7

内部エンコーディングを使用するように設定されている場合、PHPはヘッダーを自動的に送信します。

ini_set('default_charset', 'utf-8');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.