間違った結果が得られた同じページで、最初にこの命令を実行してみてください
print base64_encode("Côte");
正解はQ8O0dGU...
です。のような何か他のものを取得した場合Q/R0ZQo...
、これは、スクリプトが UTF-8 ではなく別の文字セット (ここでは Latin-1) で動作していることを意味します。MySQL やブラウザも悪ふざけをしている可能性は依然としてありますが、上記の行により、PHP やエディタがあなたを欺いていることが保証されます。
Côte
次に、データベースから抽出し、そのbase64_encode
. が表示される場合Q8O0...
、MySQL と PHP 間の接続は安全に UTF8 です。そうでない場合は、他に必要なものがあれば、MySQL 文字セット (および/またはテーブルとデータベースの照合)を変更する必要があります。SET NAMES utf8
ALTER
PHP が UTF8 で、MySQL が UTF8 であるにも関わらず無効な文字が表示される場合、それは PHP とブラウザーの間の何かです。コンテンツ タイプ ヘッダーが正しく送信されていることを確認します。そうでない場合は、スクリプトの最初に自分で送信してみてください。
Header('Content-Type: text/html; charset=UTF8');
たとえば、Apache構成では、次のようにする必要があります
AddDefaultCharset utf-8
サーバーの文字セットと自動検出の両方を上書きするようにブラウザが設定されていないことも確認してください。
注: 経験則として、UTF8 国際文字の代わりに疑問符が付いた 1 つのひし形が表示された場合、これは UTF8 リーダーが無効な UTF8 コード ポイントを受け取ったことを意味します。言い換えると、ひし形を表示しているエンティティ (ブラウザ) は UTF8 を予期していますが、別のもの (Latin1 aka ISO-8859-15 など) を受信しています。
そのエラーを取得する別の追跡が困難な方法は、出力に何らかの形でバイト オーダー マーク (BOM) が含まれている場合です。これは、次のようなファイルを作成した場合に発生する可能性があります。
###<?php
Header("Content-Type: text/html; charset=UTF8");
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF8" />
</head>
<body>
Hellò, world!
</body>
</html>
### は (ほとんどのエディターでは見えない) UTF8 BOM です。これを削除するには、エディターで許可されている場合はファイルを「BOM なし」として保存するか、別のエディターを使用する必要があります。