0

db からいくつかのデータを取得しようとしていますが、出力は期待したものではありません。
データベースで独自のクエリを実行すると、次の出力が得られます。string 'C�te d�Ivoire' (length=13)

phpmyadmin からデータベースにクエリを実行すると、通常の出力が得られます: コートジボワール

php.ini のデフォルトの文字セット、mysql db のデフォルトの文字セット、<meta>文字セットはすべて utf-8 に設定されています。

同じ構成で異なる出力が得られるエンコーディングが行われている場所を突き止めることはできません。

PS: mysqli ドライバーを使用します。

4

2 に答える 2

3

間違った結果が得られた同じページで、最初にこの命令を実行してみてください

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 utf8ALTER

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 なし」として保存するか、別のエディターを使用する必要があります。

于 2012-10-09T21:23:33.027 に答える
0

コマンド ライン ツール mysql を使用して「独自のクエリ」を実行する場合は、オプションも設定する必要があります--default-character-set=utf8。それ以外の場合は、独自のクエリの方法を教えてください。

于 2012-10-09T21:19:48.090 に答える