多言語アプリケーションのバックエンドで Unicode を使用し、フロントエンドでコード ページを使用しても意味がありません。プロジェクト全体で同じエンコーディングを使用するか、 と の間で手動で変換しUTF-8
ますwindows-1252
。
読むのに問題はないと思います。ラベルは DB から切り捨てられます。そうしないと、ブラウザに文字化けが表示されます。したがって、これは PHP/HTML の問題ではなく、MySQL の問題です。などの場合èéàòì
、MySQL は確かに UTF-8 から CP1252 (latin1) に変換できます。ただし、そうでない場合 (同じ文字列を UTF-8 から CP1251 に変換しようとした場合など)、MySQL は疑問符を表示し?
ます。
あなたの場合、それは入力の問題だと思います。つまり、DB でラベルが切り捨てられています。これはどのように可能ですか?UTF8 の PHP と MySQL を使用windows-1252
している場合でも、そのような文字セットで読み込まれたページからフォームを送信すると、ブラウザーは文字列を送信します。UTF-8
PHP スクリプトでは、データベースに挿入する前にこの文字列を にトランスコードするか、 を使用して MySQL に接続する必要がありますSET NAMES 'CP1252'
。そうしないと、無効な UTF-8 バイトの束を挿入しようとすることになり、MySQL は文字列を切り捨て、ラベルは空になります。添付はテストケースです。ここにtest
テーブルがあります
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
これがPHP部分です。このスクリプトは UTF-8 でエンコードされているため、スクリプトに含まれるすべてのリテラル文字列は同じエンコードであることに注意してください。
// This is a UTF-8 file, so my editor uses UTF-8 and thus each literal
// string is a UTF-8 string, since PHP only has binary strings.
$label = "Référence";
// Now let's translate this string as if it came from a browser submitting
// a form loaded from a cp1252 encoded page
$src = mb_convert_encoding($label, "CP1252", "UTF-8");
// But connect as if I were UTF-8
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8',
'test', 'test');
// Insert the string
$stmt = $db->prepare('INSERT INTO test (name) VALUES ( ? )');
$stmt->bindValue(1, $src);
$stmt->execute();
// Read it
header("content-type: text/plain; charset=windows-1252");
foreach($db->query('SELECT * FROM test') as $row)
echo $row['name'] . "\n";
どのように回復しますか?文字セットを使用して MySQL に接続し、cp1252
MySQL に翻訳させるか、スクリプトで文字列をトランスコードします。
データを正しく取得したら、それらを抽出して HTML ページに配置する必要があります。今回は同じ問題が発生しますが、逆になります: CP1252 ドキュメントで UTF-8 文字列を表示します。CP1252 では char の長さが正確に 1 バイトであるのに対し、UTF-8 は可変長エンコーディングであるため、DB のバイトは不適切です。これらのバイトをページに直接配置すると、ブラウザは余分なバイトに対してランダムな意味不明な内容を表示します。繰り返しになりますが、CP1252
文字セットを指定してデータベースに接続し、MySQL が変換を処理して適切なバイトを提供するようにするか、PHP 側で自分でバイトをトランスコードします。
または、自分に有利なことをしたほうがよいでしょう。どこでも同じエンコーディングを使用してください。UTF-8
今日は正しいことなのでお勧めしますが、英語とフランス語の文字を表すことができるため、うまく選択できますCP1252
(また、ストレージがいくらか節約されますが、これは問題ではないと思います)。