2011-01-18 7 views
0

Debianサーバ上のPHPでUTF-8文字列に問題があります。詳細でDebianサーバ上のPHP DOMに関するUTF-8問題

アップデートは

I'veは少しより多くのテストを行って、状況は今より具体的です。状況に合わせてタイトルと詳細を更新しました。応答に感謝し、問題が明確に説明されていなかったことを謝ります。次のスクリプトは、私のローカルのWindowsマシン上ではなく、私のDebianサーバ上で正常に動作します:

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
$string = '<html><head></head><body>UTF-8: ÄÖÜ<br /></body</html>'; 
$document = new DOMDocument(); 
@$document->loadHTML($string); 
echo $document->saveHTML(); 
echo $string; 

予想したように、私のローカルマシン上の出力は次のとおりです。

UTF-8: ÄÖÜ 
UTF-8: ÄÖÜ 

私のサーバー上での出力は次のようになります。

UTF-8: ÄÖÜ 
UTF-8: ÄÖÜ 

私はBOMのないUTF-8でNotepad ++でスクリプトを書いて、SSHで転送しました。 guidoが気づいたように、文字列自体は適切にUTF-8でエンコードされています。 PHP DOMやlibxmlに問題があるようです。その理由は、マシンに依存するため、設定が必要です。

オリジナル質問

私はWindows上でXAMPPでローカルに動作し、すべてが正常です。しかし、サーバーにUTF-8文字列を使ってプロジェクトを展開すると、すべての文字列が乱れてしまいます。実際にこのテストスクリプトをアップロードすると、

echo utf8_encode('UTF-8 test: ÄÖÜ'); 

私は "ÃÃ"を取得します。また、パテとサーバーに接続すると、ウムラウト(ÄÖÜ)をシェルに正しく書き込むことができません。私はこの問題がPHP関連であるのかどうか分かりません。

答えて

0

問題の原因は、サーバー上の古いバージョンのlibxml(2.6.32。)でした。開発マシンでは2.7.3でした。 libxmlをバージョン2.7.8の不安定なパッケージにアップグレードしました。問題はもう解消されました。

+0

質問の範囲が間違っていて、最終的にそれに答えるのは申し訳ありません。残念ながら、この問題はlibxmlに関連していました。 –

2

ApacheのAddDefaultCharset設定を確認してください。

標準のDebian apacheディストリビューションでは、設定を/etc/apache2/conf.d/charsetに変更できます。

+0

既にチェックされています。なにもない。しかし、応答は 'text/html;に設定されています。 charset = utf-8' –

+0

試してみてください。残念ながら、それは問題を解決しません。 –

1

ファイルがローカルマシンと同じバイト単位であることを確認してください。テキストモードでのFTP転送は、それを台無しにする可能性があります。バイナリを試してみてください。

+0

転送はSVN(コミットとサーバ側のエクスポート)です。私はそれが同じバイトでなければならないと思う。またはSVN何かを台無しにすることができますか? –

+0

可能性は低いですが、引き続きチェックする価値があります。 – BarsMonster

+0

私はputtyからSVNからWebディレクトリにプロジェクトをデプロイするためのbashスクリプトを呼び出しています。私のロケールや接続の設定(これはうんざりしているかもしれません)がSVNのエクスポートに影響を及ぼしますか? –

0

php.iniファイルにサーバー上のdefualtの文字セットを変更してみてください:

DEFAULT_CHARSET =「UTF-8」も

、必ずあなたがUTF-として適切なコンテンツタイプヘッダを送信している作ります8

php mbstringモジュールを適切に設定してmbstring関数を使用し、データベース接続がutf-8を使用していることを確認した場合は、utf-8を使用しても問題は発生しません。

デシベルの一部は、クエリを使用してMySQLのために行うことができます「SET NAMES 『UTF8』」

私は通常、バッファを処理するためのmbstring使用して、出力バッファを開始しました。これは私が本番ウェブサイトで使用しているものであり、非常に確かなアプローチです。その後、コンテンツのレンダリングが完了したらバッファを送信します。

あなたはそのためのsampeコードが必要かどうかお知らせください。

phpやwebserverが間違ったヘッダーを送信しているかどうかを確認するもう1つの簡単なやり方は、ブラウザのview-> encodingメニューを使ってutf-8かどうかを確認することです。そうでなければ、それをutf-8に切り替えると、すべてが正常に見える場合は、ヘッダーまたはコンテンツタイプに問題があります。すでにutf-8で、テキストが壊れている場合は、コードまたはdb接続で間違っていることがあります。 mysqlを使用している場合は、関係するテーブルとカラムもutf-8

0

明示的にcontent-typeヘッダを送信していますか?これを省略すると、Apacheがあなたのために送信している可能性があります。ファイルがLatin-1エンコーディング(Apacheによる)で提供され、ブラウザがそれを読み取った場合、あなたのUTF-8文字は不正な形式になります。そして、この

<?php 
echo "Drop some UTF-8 characters here."; 

:最初はない場合

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
echo "Drop some UTF-8 characters here."; 

第二は、動作するはず

はこれを試してみてください。また、ファイルをUTF-8でエンコードされたファイルとして保存することもできます(まだない場合)。

データベースの文字が混乱している場合は、(My)SQL接続のエンコーディングを設定してみてください。

+0

Content-Typeヘッダーは 'text/htmlです。 charset = utf-8' –

1

EDIT:更新された質問に対する答え:

 
<?php 
header("Content-Type: text/html; charset=UTF-8"); 
$string = '<html><head>' 
.'<meta http-equiv="content-type" content="text/html; charset=utf-8">' 
.'</head><body>UTF-8: ÄÖÜ<br /></body</html>'; 
$document = new DOMDocument(); 
@$document->loadHTML($string); 
echo $document->saveHTML(); 
echo $string; 
?> 

私はあなたの入力文字列がすでにUTF-8であると思います。試してください:

 
setlocale(LC_CTYPE, 'de_DE.UTF-8'); 
$s = "UTF-8 test: ÄÖÜ"; 
if (mb_detect_encoding($s, "UTF-8") == "UTF-8") { 
    echo "No need to encode"; 
} else { 
    $s = utf8_encode($s); 
    echo "Encoded string $s"; 
} 
+0

「エンコードする必要はありませんが、setlocale(LC_CTYPE、 'de_DE.UTF-8');を設定した後、テストスクリプトの出力は正しいです。これはサーバーの問題ですか?自分のロケールをUTF-8に設定するにはどうすればよいですか? –

+0

@Alex Lawrence Debianシェルでスクリプトを編集した場合、シェルがデフォルトのUTF8エンコーディングをLinuxで使用しているので、UTF-8文字を入力していることを確かめています(パッティでこのログオンを確認して*エコー$ LANG *を入力してください) ;私は窓について知っていません、それはまだCP-1252を使用していると思います。 –

+0

$ LANGのエコーは 'de_DE.UTF-8'です。私はvimの使い方を知らないので、テストスクリプトにnanoを使用しました。あなたのコードを貼り付けると、文字はナノに正しく表示されませんが、ブラウザの出力は正しいです。私は問題が何かを得るように見えません。私はちょうど私のプロジェクトからのターミナルを使用してSVNのエクスポートを行い、PHPのUTF - 8の文字列はすべて乱れて取得します。 :( –