3

サイトの転送を扱っていますが、その過程で文字セットが汚れてしまいました。最初に、すべてのファイルを変更せずに転送したところ、新しいサーバー上のファイルには<?>特殊文字のアイコンが表示されました。ブラウザの文字エンコーディング (Chrome と FF) を一目見ただけで、UTF-8 を自動検出していることがわかりました。ページのメタ文字セットは ISO-8859-1 に設定されています。コピーは、複数のデータベースのさまざまなテーブルから取得されます (質問しないでください)。

元のサイトでは、すべて正常に表示されました。新しいサイトで、<?>... 掘り下げてみると、php.ini にデフォルトの charset ="UTF-8" が見つかり、何も設定しませんでした。現在、サイトのほとんどのページは正常に表示され、ブラウザはメタ文字セット タグを認識しており、誰もが満足しています。つまり、ルート外のフォルダーに移動するまでです。

このフォルダー内のファイルは、メタ文字セットが ISO-8859-1 ですが、ブラウザーに UTF-8 として読み取るように指示しています。これは<?>、これらのページで表示されていることを意味します。ブラウザーを ISO-8859-1 として読み取るように設定すると、問題なく表示されます。自動検出により、UTF-8 にリセットされます。何か案は?

ありがとうございました!

更新(以下のコメントから追加):

martinstoeckli の推奨に従ってW3C チェッカーを使用してページを実行したところContent-Type: text/html; charset=utf-8、メタ タグが<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>であるときに HTTP コンテンツ タイプが であることがわかり、競合する文字エンコーディング宣言エラーが発生します。クレイジーなことに、UTF-8 宣言がどこから来ているのか、一生わからないのです! どのファイルにもありません。すべてのファイルは BOM なしで UTF-8 で保存されています。php.ini はデフォルトを宣言しないように設定されており、フォルダーの .htaccess は PatomaS が示唆するように設定されています。

(価値があるのは、Mozilla の Web Sniffer が HTTP ヘッダーの Content-Type を確認することですtext/html; charset=utf-8。)

更新: 私が提起したこの問題の解決には至りませんでしたが、文字エンコーディングの問題を解決する最善の方法は、UTF-8 エンコーディングを使用するようにすべてをリファクタリングすることであると判断しました。もちろん、これはおそらく、「なぜ utf8-encode() が私の łâùñdrÿ を実行しないのですか?」のような、よりエキサイティングな初心者の質問で私を見ることになることを意味します。

もちろん、それは謎が残っていることを意味します: すべてが異なって設定されているように見えるときに、サーバーが UTF-8 の HTTP Content-type charset ヘッダーを送信する原因は何ですか?

4

5 に答える 5

4

ファイルにBOM(バイト順マーク)が含まれている可能性がありますか。notepad ++でファイルを開き、[コーディング]メニューをオンにするために、テストのオプションとして[ansiに変換]を選択することもできます。

ところで、どこでもutf-8を使用することは、私が提案できるより良い長期的なアプローチです。

于 2012-10-21T04:16:11.233 に答える
4

PHP 5.6 には、 に設定された新しいデフォルトの charset ディレクティブが付属していますUTF-8。場合によっては、これが metatag で latin1 として提供されるページで問題になる可能性があり、検証サービスで競合が発生する可能性がありini_set('default_charset', 'iso-8859-1')ます。スクリプトで呼び出すことにより、このディレクティブをオーバーライドできます。

これを行うには、latin1 にコード化する各 php ファイルに、スクリプトの先頭に次のコードを追加します。

例:index.php

<?php
  $server_root = realpath($_SERVER["DOCUMENT_ROOT"]);
  $config_serv = "$server_root/php/config.php";
  include("$config_serv");
?>

次に、ルート Web サイトの下に「php」フォルダーを作成し、このコードを次の場所に配置しますconfig.php

例:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset utf-8 to latin1 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'ISO-8859-1');
?>

php.ini が latin1 ( ISO-8859-1) に設定されていて、utf-8 (unicode) ページを提供したい場合は、同じ方法を使用してエンコードを強制できますが、iso-8859-1 の代わりに utf-8 を使用します。それを見て:

例:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset latin1 to utf-8 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'UTF-8');
?>

私の答えがお役に立てば幸いです。私はこの方法で問題を解決しました! 私のページをlatin1として、ヘッダーをutf-8として与えるfirefoxとそのhtml/cssバリデーターに問題がありました。この矛盾は解決されました!私はついに私の答えを使って解決しました。

于 2015-03-07T15:34:58.237 に答える
0

.htaccessiso-8859-1にしたいすべてのファイルのルートでこれを設定できます

<FilesMatch "\.(htm|html|xhtml|xml|css|js|php)$">
    AddDefaultCharset iso-8859-1
</FilesMatch>

サーバー ヘッダーはインライン ヘッダーよりも優先されることに注意してください。

于 2012-10-21T13:40:57.780 に答える