3

我有一个 mysql 数据库表来存储国家名称和货币符号 - CHARSET 已正确设置为 UTF8。

这是插入到表中的示例数据

插入国家(国家名称、货币名称、货币代码、货币符号)值
('UK','Pounds','GBP','£');

当我查看数据库时 - 英镑符号看起来很好 - 但是当我从数据库中检索它并将其显示在网站上时 - 一个奇怪的方形符号出现了,里面有一个问号而不是英镑符号。

在 my.cnf 中编辑 - 字符集设置为 latin1 - 我将其更改为 utf8 - 然后我以 root 身份登录并运行 \s - 它返回

服务器字符集:utf8
客户端字符集:utf8

排序规则

-- 数据库
选择 default_collat​​ion_name
  FROM information_schema.schema
 WHERE schema_name = 'swipe_prod';

这不会返回任何东西

-  桌子
SELECT table_collat​​ion
  FROM information_schema.tables
 WHERE TABLE_NAME = '国家';

这返回 utf8_general_ci

-  列
选择 collat​​ion_name
  FROM information_schema.columns
 WHERE TABLE_NAME = '国家';

这返回 7 行,但都有 null 或 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'");
而($row = mysql_fetch_array($result))
{
  回声 $row['country_name'] 。“”。$row['currency_symbol'];
}
mysql_close($con);
?>

请指教 谢谢

4

7 回答 7

7

当您看到“内部带有问号的奇怪方形符号”也称为REPLACEMENT CHARACTER时,这通常表明您有一个 80-FF (128-255) 范围内的字节并且系统正在尝试渲染它是 UTF-8 格式的。

整个字节范围对于 UTF-8 中的单字节字符无效,但在 ISO-8859-1 等西方编码中都很常见。

当我查看您的页面并手动将字符编码从 UTF-8 切换到 ISO-8859-1(在 Firefox 中使用View>> Character Encoding>> Western (ISO-8859-1))时,POUND SIGN会正确显示。

那么,有什么问题呢?很难说——有几十个地方可以搞砸。但很可能是在数据库级别。将表上的 CHARSET 设置为 UTF8 一般是不够的。您的所有字符集和排序规则都需要按顺序排列,然后字符才能在系统中正确移动。一个常见的陷阱是不正确地设置连接字符集,所以我会从那里开始。

如果您需要更多指导,请告诉我。

编辑

要检查该值实际存储了哪些字节,请运行此查询。

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

如果您看到A3,那么您知道该字符存储为 ISO-8859-1。这意味着问题发生在写入数据库期间或之前。

如果您看到C2A3,那么您就知道该字符存储为 UTF-8。这意味着问题发生在从数据库读取之后和写入浏览器之前。

编辑 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';
于 2010-06-02T16:29:31.903 回答
3

掏出我的 2 便士。我使用utf8_encode()从数据库中输出数据。这似乎也照顾其他角色。

于 2013-08-28T11:38:31.500 回答
1

尝试使用

&pound;

代替 £ 符号,或者,在您打印 £ 符号的地方,执行以下操作:

<%=replace(stringWithPoundInIt,"£","&pound;"%>
于 2010-06-02T16:43:47.600 回答
1

我有同样的问题。我所做的是在连接到数据库(PHP)后立即运行它:

mysql_query("SET NAMES utf8");

希望这可以帮助..

于 2012-01-04T11:51:52.553 回答
1

我遇到了同样的问题,我通过在 MySQL 数据库上运行 SELECT 查询之前添加以下 PHP 代码解决了这个问题。

mysql_query("SET character_set_results=utf8", $link);
于 2012-02-06T09:09:58.213 回答
1

我自己遇到了这个问题,并在输出阶段使用“ mb_convert_encoding ”解决了。

使用您的示例...

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

于 2013-07-02T12:17:55.123 回答
0

您可以在这里查看。我不确定它是否有效,但请尝试一下,因为这很奇怪,我以前从未见过类似的东西。

于 2010-06-02T16:30:24.463 回答