0

リモート mysql データベース接続を介して外国語の UTF8 データを取得しようとしています。データをリモートで取得すると、ブラウザーに utf8 が正しく表示されません。ただし、ローカル データベース接続を介してデータを取得すると、ライブ サイトとローカル テスト マシンの両方で、文字がブラウザーに正しく表示されます。

私のリモート接続は、wamp ローカル サーバーからオンラインのライブ Web サイトです。

私が設定したすべてのページについて:

header('Content-Type: text/html; charset=utf-8');

また、UTF-8 メタ タグを設定しようとしました。また、デフォルトの文字セットとして .htaccess に UTF8 を指定しています。

これは古い Web サイトなので、まだ mysqli を使用しています。私も設定しようとしました:

$mysqli->set_charset("utf8");

たとえば、リモート接続では Français は Français として表示されます。

私はこれをどうするかわかりません。私はそれを理解しようと何時間も費やしましたが、役に立ちませんでした。コードを要求するのが一般的であることは知っていますが、あまりにも多くのコードがあるため、ここにすべてを含めることはできません。

ありがとう!

4

2 に答える 2

1

そして、あなたの解決策は次のとおりです。リモートデータベースでは、データが utf8 に 2 回エンコードされ、誤った結果が得られます。コードに問題はありません。データベースに問題があります。そこで修正できます(varcharの場合は、最初にバックアップを作成してください!):最初にlatin1に変換し、次にバイナリに変換してからutf8に変換します。ここにある方法を示すための実用的なSQLフィドル。将来、sqlfiddleがどこかでコードを削除する場合に備えて、ここにもコードを貼り付けます。

-- database column correctly defined as utf8
CREATE TABLE base (col VARCHAR(128) CHARSET utf8);
-- wrong data is entered:
INSERT INTO base SELECT UNHEX('4672616EC383C2A7616973');
-- first, convert back to latin-1, we have now proper utf-8 data, but in a latin1 column
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET latin1;
-- convert to binary first, so MySQL leaves the bytes as is without conversion
ALTER TABLE base MODIFY COLUMN col VARBINARY(128);
-- then convert to the proper character set, which will leave the bytes once again intact
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET utf8;
于 2013-06-05T17:32:00.573 に答える
0

リモートデータベースを呼び出すスクリプトに次を追加して、機能させました。

$mysqli->set_charset("latin1");

文字がおそらく正しくエンコードされていないか、正しく照合されていないことを意味するため、それが少しハックであるかどうかはわかりませんが、機能します。文字セットの変更を教えてくれた Wrikken に感謝します。今後はこれらを使用して適切に修正することができます。

于 2013-06-06T01:11:53.327 に答える