2017-05-31 11 views
0

私はページを持っていますが、異なるデータベース(異なる文字セットを持つ可能性があります)からデータを読み込みます。 問題は、壊れた文字セットをUTF-8にロードすることです。 そして、私は方法を見つけ出す必要があります。PHPのデータベースから文字列が間違っています

私の接続は次のとおりです。

$db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS); 
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

あなたが見ることができるように、私は私が<meta charset="utf-8">

<head>にしていると私はいくつかの変換を試してみました 'SET NAMES utf8'

を使用します。

error_log("ORGIGINAL: ".$row["title"]); 
error_log("ICONV: ".iconv(mb_detect_encoding($row["title"], mb_detect_order(), true), "UTF-8", $row["title"])); 
error_log("UTF_ENCODE: ".utf8_encode ($row["title"])); 

私は信じて、私はすべてのファイルを持っているUTF-8で余裕があります (ノートパッドをANSIからUTF-8に切り替えるたびにすべてのファイルを再保存しました) 私は間違った出力を得ただけでなく、ブラウザとエラーログの出力が異なります。 DBに格納されている

元の文字列: http://screenshot.cz/F7/F7XRF/sdb.png

FIREFOX反応:元

http://screenshot.cz/TG/TG7RX/for.png

はutf8_encode:

http://screenshot.cz/H9/H9IZJ/fu.png

のiconv: はutf8_encode

と同じで、今、それはPHPのエラーファイルにロードされた方法:あなたが見ることができるように、出力は元の形状で最高の結果を持っている http://screenshot.cz/FY/FYXEE/el.png

、しようとしている場合ながら変換すること、それはより変形された出力を有する。また、エラーログファイルの文字セットをUTF-8(元の不明/ ANSIおそらく)に変更しようとしましたが、どちらのエンコーディングでも同じ形になります)

テキストは中央ヨーロッパ/チェコです。 必要な文字は以下のとおりです。 áE YíóúU žščR D T N E

ので、間違っているものになることができます任意のアイデア、?

ありがとうございました:)

+0

私は以前に[** an answer **](http://stackoverflow.com/questions/31897407/mysql-and-php-utf-8-with-cyrillic-characters/31899827#31899827)を書いていますPHP/MySQLアプリケーションでcharsetの問題の大半*をカバーする小さなチェックリストです。 さらに詳細なトピック[UTF-8すべての方法](http://stackoverflow.com/questions/279170/utf-8-all-the-way-through)もあります。ほとんどの場合、これらのトピックのいずれかまたは両方の解決策が見つかります。 – Qirel

+0

utf8以外の文字セットを使用しましたか? –

答えて

0

変換機能は使用しないでください。

ブラックダイヤモンドには2つの原因があります。参照してくださいTrouble with utf8 characters; what I see is not what I stored

エラーファイルは、Mojibake、またはおそらく "二重エンコーディング"を展示しています。上記のリンクでも説明しています。

FirefoxがページをUTF8として解釈していることを確認してください。古いバージョンでは必ずしもそうとはみなされませんでした。

ああ、私はただの疑問符に気付いた。 (リンクでもカバーされています)あなたは一番多くの人のために賞金を獲得しました。

これは、複数のエラーが発生している可能性があります。がんばろう。さまざまな段階(PHP、データベーステーブルなど)でデータのHEXを提供すると、私はより詳細に手助けすることができます。

チェコ語の文字セットの問題は、一部の文字(急なアクセント付きの文字)が西ヨーロッパのサブセットに存在するため、正しく表示される可能性が高いことです。他のアクセントはほとんどがチェコ語(carons)に特有であり、別のパスになります。これは、いくつかのサンプルが2つの異なる失敗事例を示す理由を説明します。 (このフォーラムにチェコの検索;。あなたかもしれないのヒント)

いくつかの実験をした後...

?eskéはおそらく表はlatin1(または他の「ラテン」)であることに、カラムのCHARACTER SETから来て、データを挿入するときに接続をlatin1として確立します。これはブラウザがutf8ではなく、西洋のモードで表示されます。

?esk�が表示され、の場合もにはlatin1が選択されています。これはブラウザがutf8に設定されている場合に表示されます。

警告:解析結果だけでは、表示されている内容を取得する唯一の方法ではない場合があります。

+0

こんにちは、応答のおかげで、私は通過して試してみます。しかし、最初の見方では、問題の99%がデータがどのように格納されているかのようです。まあ、それは悪いです。私は、さまざまなCMSの多くのデータベースに接続しなければならないWebアプリケーションを作成しています。これらのCMSは私の手の届かないところにあり、設定が異なるかもしれません。彼らは記事の大きなデータベースを持っており、彼らはプロジェクトを実行しています。残念ながら、私はこれらのデータベースを編集したり、データをロードして再保存して正しいエンコーディングにすることはできません。だから私は解決策が必要です、どのような既存の文字列を読み込んで(検出された?)エンコーディングし、私のアプリで使用するために正しく再エンコードする方法? – Zorak

+0

少数のSQL文でデータを修正する方法かもしれません。それはデータがいかにひどく乱されているかによって変わります。 (私のリンクで議論されているように)16進数を取得し、そのページのコメントの「修正」を参照してください。しかし同時に、データを修正すると同時に、CMSは物事の誤った保管を停止しなければなりません。 –

関連する問題