質問

国名と通貨シンボルを保存するためのMySQLデータベーステーブルがあります - charsetはUTF8に正しく設定されています。

これは、テーブルに挿入されたデータの例です

insert into country ( country_name, currency_name, currency_code, currency_symbol) values 
('UK','Pounds','GBP','£');

データベースを見ると、ポンドシンボルが正常に見えますが、データベースから取得してウェブサイトに表示すると、ポンドシンボルの代わりに内部に疑問符が表示されます。

my.cnfで編集 - キャラクターセットはlatin1に設定されていました - 私はそれをutf8に変更しました - それから私はrootとしてログインして実行しました - それは返されました

Server characterset:    utf8
Client characterset:    utf8

照合

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'swipe_prod';

THIS DOES NOT RETURN ANYTHING

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

THIS RETURNS utf8_general_ci

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

THIS RETURNS 7 ROWS but all have either null or utf8_general_ci

PHPコード

<?php
$con = mysql_connect("localhost","user","123456");
mysql_select_db("swipe_db", $con);
$result = mysql_query("SELECT * FROM country where country_name='UK'");
while($row = mysql_fetch_array($result))
{
  echo $row['country_name'] . " " . $row['currency_symbol'];
}
mysql_close($con);
?>

アドバイスありがとうございます

役に立ちましたか?

解決

あなたが「中に疑問符がある奇妙な正方形のシンボル」を見ると 交換キャラクター, 、それは通常、80-ff(128-255)の範囲にバイトがあることを示す指標であり、システムはUTF-8でそれをレンダリングしようとしています。

そのバイトレンジ全体は、UTF-8のシングルバイト文字では無効ですが、ISO-8859-1などの西洋のエンコーディングではすべて非常に一般的です。

私があなたのページを表示して、UTF-8からISO-8859-1にエンコードする文字を手動で切り替えるとき(Firefoxで View >> Character Encoding >> Western (ISO-8859-1)) そうして ポンドサイン 適切に表示します。

それで、何が問題なのですか?言うのは難しいです - これをファウルアップできる場所がたくさんあります。しかし、おそらくそれはデータベースレベルにあります。テーブルのcharsetをUTF8に設定するだけでは十分ではありません。キャラクターがシステムを適切に移動する前に、すべての充電器と照合が整理される必要があります。一般的な落とし穴は不適切に設定されています 接続充電器, 、だから私はそこから始めます。

さらにガイダンスが必要かどうか教えてください。

編集

実際にその値のバイトが実際に保存されているかを確認するには、このクエリを実行します。

SELECT hex( currency_symbol )
  FROM country
 WHERE country_name = 'UK'

あなたが見るなら A3 次に、キャラクターがISO-8859-1として保存されていることがわかります。これは、問題がDBに書き込む前または前に発生することを意味します。

あなたが見るなら C2A3 次に、キャラクターがUTF-8として保存されていることがわかります。これは、DBから読み取り、ブラウザに書き込む前に問題が発生することを意味します。

編集2

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'your_db_name';

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

他のヒント

私の2ペンスでチッピング。私が使う utf8_encode() データベースからデータを出力します。これも他のキャラクターの世話をしているようです。

使用してみてください

&pound;

£シンボルの代わりに、£サインを印刷する場所で、次のことを行います。

<%=replace(stringWithPoundInIt,"£","&pound;"%>

同じ問題がありました。私がしたことは、データベース(PHP)に接続した直後にこれを実行したことでした。

mysql_query("SET NAMES utf8");

お役に立てれば..

同じ問題があり、MySQLデータベースで選択クエリを実行する直前に以下のPHPコードを追加することで解決しました。

mysql_query("SET character_set_results=utf8", $link);

私は自分でこの問題に出くわし、出力段階で「」を使用して解決しました。MB_CONVERT_ENCODING".

あなたの例を使って...

echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");

チェックアウトできます ここ。それが機能するかどうかはわかりませんが、これは奇妙なので試してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top