4

約2ダースの投稿を経た後、私は公式に困惑しています。utf8_general_ci 照合列を持つデータベースがあります。PHPMyAdmin を使用すると、テーブル内の UTF-8 データを正しく表示できます (少なくとも、私が知る限り)。私がやりたいことは十分に単純だと思いました。さまざまな方法でデータを照会しましたが、utf-8 値をエコーし​​たいだけです。

echo bin2hex("more…"); //note "…" is a special character
6d 6f 72 65 e2 80 a6 (Hex Value)

ただし、 $row->value を単にエコーすると、次のようになります。

6d 6f 72 65 85

UTF-8 エンコーディングは次のようになります。

6d 6f 72 65 c2 85

私が読んだほとんどの投稿は mysql_set_charset("utf8") を使用すると述べていますが、これは本当に物事を台無しにします:

6d 6f 72 65 26 61 63 69 72 63 3b 80 26 62 72 76 62 61 72 3b

そして最後に mysql_set_charset("utf8") & utf8_encode($var) を使用:

6d 6f 72 65 26 61 63 69 72 63 3b c2 80 26 62 72 76 62 61 72 3b

PHPでUTF8設定を設定しようとしました。Godaddy はこれを少し難しくするので、ini_set を使用してこれを行いました。ただし、mbstring.encoding_translation は有効になりません。

// UTF8 settings
ini_set('mbstring.language',            'Neutral');
ini_set('mbstring.internal_encoding',       'UTF-8');
ini_set('mbstring.http_input',          'UTF-8');
ini_set('mbstring.http_output',         'UTF-8');
ini_set('mbstring.encoding_translation',    'On');
ini_set('mbstring.detect_order',        'auto');
ini_set('mbstring.substitute_character',    'long');

私が何をする必要があるかについてのヒントはありますか?

4

5 に答える 5

4

私の賭けは、あなたの実際のデータがutf8以外のもので保存されている可能性があるということです.

最初に、データベースが適切に設定されていることを確認してください。つまり、すべてが実際に UTF-8 エンコーディングで保存されていることを意味します。

これは、同様の問題に直面したときに私が行ったことです:

常にクリーンなテーブルでテストを行います。つまり、テスト目的で新しいデータベースとテーブルを作成し、データベースに実際に格納されているすべてのデータが実際に utf8 でエンコードされていることを最初から確認する必要があります。

データベースのエンコードが utf8 であることを確認します。

CREATE DATABASE `test` CHARACTER SET `utf8` COLLATE `utf8_general_ci`; 

テキストを含むフィールドが utf8 でエンコードされていることを確認してください。

CREATE TABLE `test` \
(`id` INT AUTO_INCREMENT PRIMARY KEY, \
`name` VARCHAR(512) COLLATE `utf8_general_ci`) \
CHARACTER SET `utf8` COLLATE `utf8_general_ci`;

データの取得に使用される接続が、変更されていない UTF-8 文字列を返すことを確認してください。

$connection = mysql_connect( ... );
// Make sure that connection does not change encoding:
mysql_set_charset('utf8', $connection);
// Insert some test data:
mysql_query("INSERT INTO `test` (`name`) VALUES (`Ab✓cdÄö`)", $connection);

その後、それを読んで、正常に機能するかどうかを確認してください。機能する場合、問題は既存のデータベース、テーブル構造、または接続の何かが間違っていることであり、テストで設定したものと似ているはずです。環境。

phpmyadmin を使用している場合は、すべてを utf8 として設定し、すべてのポイントで同じ適切な utf8 照合を選択するだけです。次に、phpmyadmin を使用していくつかのデータをテーブルに追加し、それを php アプリケーションで読み取ってみます。utf8_general_ci はうまく機能するはずです。

ここにいくつかの情報があります: MySQL 接続文字セットと照合順序

于 2012-04-17T19:06:55.700 に答える
2

PDOを使用すると、文字セットを簡単に変更できます。また、プリペアドステートメントやトランザクションなどもサポートしています。したがって、クラスの作成時に文字セットを設定するだけで、すぐに使用できます。

PHPマニュアルのコメントから:

$db = new PDO('mysql:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
于 2012-04-11T08:50:28.860 に答える
1

これを試すことができます:

SET NAMES utf8;
SET CHARACTER SET utf8;

ここここここを参照してください。

于 2012-04-11T02:37:09.103 に答える
0

この投稿では、PHP と MySQL での UTF-8 の操作のすべての側面について説明します。

それがあなたの時間を助け、節約することを願っています。

于 2014-04-17T15:31:12.053 に答える
0

Deceze に感謝します。犯人は htmlentities 呼び出しであり、次のものに置き換える必要がありました。

htmlspecialchars($row['col'], ENT_QUOTES, "UTF-8");

結局、自分のコードを読み間違えただけです。結局のところ、それはとても些細なことでした。イライラしますが、解決策を見つけてうれしいです。

ご助力いただきありがとうございます。

于 2012-04-11T05:16:40.507 に答える