nginx / apache設定での「正しい」utf-8エンコーディング

この投稿が多くの開発者に役立つことを願っています。 インターネット上の多数のスレッドから判断すると、問題は非常に一般的です。 問題の本質は次のとおりです。nginx/ apache設定のutf-8エンコーディング名が正しくありません。 同時に、サーバーによって提供されるコンテンツは、Internet Explorerを除くすべてのブラウザーで正常に認識されます。







多くの場合、多くの開発者は、仮想ホストを構成するときに、インターネットのどこかまたは他の場所から設定をコピーします。 同時に、エラーが設定に「移行」します。 nginxの場合、これはディレクティブです。

文字セットutf8;


Apacheの場合、これは次のとおりです。

<Directory / path / to / site />

AddDefaultCharset UTF8

</ Directory>



だから-utf8のようなエンコーディングはありません! (ハイフンを使用して) utf-8を正しく記述します。 ほとんどのブラウザー(Firefox> = 3、Opera> = 9、Chrome> = 4、Safari> = 4)はエンコードとしてutf8を使用することに忠実であり、配信されたコンテンツを正しく認識しますが、 Internet Explorerのすべてのバージョン(最新の9 )コンテンツの代わりに、「詐欺師」を配ります。 もちろん、Webサーバーの設定を修正しなくても、この状況は簡単に解消されます。 そのため、たとえば、PHPを使用して動的コンテンツを返す場合、スクリプト自体でエンコードを明示的に指定できます。

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


または、HTMLで次のタグを使用します。

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


そして、すべてがうまくいきますが、AJAXを使用してJavaScriptが静的コンテンツに手を伸ばそうとするときの状況は複雑です。 jQueryを使用した例:

$( document ).ready( function (){

関数 print_r()

{

// ...

}

$ .ajax({

url: "/test.txt"

dataType: "text"

success: 関数 (データ、textStatus){

$( '#res' ).html(データ);

}、

エラー: 関数 (jqXHR、textStatus、errorThrown){

$( '#res' ).html( 'jqXHR:' + print_r(jqXHR)+ '<br /> textStatus:' + textStatus + '<br /> errorThrown:' + print_r(errorThrown));

}

});

});


この場合、IEは次の性質のエラーを生成します。

{

jqXHR:{

readyState:4、

ステータス:0、

statusText: 'エラー'

}、

textStatus: 'error'

errorThrown:{

名前: 'エラー'

番号:-1072896658、

説明: 'アクションを完了できませんでした。 エラーc00ce56e。

メッセージ: 'アクションを完了できませんでした。 エラーc00ce56e。

}

}


このJSエラーは非常に重要です。 そして、既にこれに遭遇したユーザーが問題をすぐに認識した場合、初めてこれに直面したユーザーは戸惑いを経験し、理由を見つけるのに多くの時間を費やすかもしれません。



PSコメントに正しく記載されているように、MySQLにアクセスするときは、次のクエリを使用して、データベースにアクセスするエンコーディングを示します。

名前の設定utf8


とにかく、utf-8エンコーディングへのリンクがあるところはどこでも、例えばテーブルを作成するとき:

CREATE TABLE `some_table`(...)ENGINE = innoDB DEFAULT CHARSET = utf8


エンコーディングは、utf-8ではなくutf8によって指定されます。 つまり、この場合、レコードはハイフンなしで行われ、何が起こっているのかを理解する上でさらに大きな認知的不協和をもたらします



All Articles