英镑符号在网页上无法显示

3
我有一个MySQL数据库表来存储国家名称和货币符号 - 字符集已正确设置为UTF8。
以下是插入到表中的示例数据:
insert into country ( country_name, currency_name, currency_code, currency_symbol) values ('英国','英镑','GBP','£');
当我查看数据库时,英镑符号显示正常,但是当我从数据库检索并在网站上显示它时,出现了一个奇怪的方块符号,里面有一个问号,而不是英镑符号。
编辑: 在my.cnf中,字符集设置为latin1,我将其更改为utf8,然后以root身份登录并运行\s,返回:
Server characterset: utf8 Client characterset: utf8
排序方式:
- 数据库
SELECT default_collation_name FROM information_schema.schemata WHERE schema_name = 'swipe_prod';
此查询未返回任何结果。
- 表
SELECT table_collation FROM information_schema.tables WHERE TABLE_NAME = 'country';
此查询返回utf8_general_ci。
- 列
SELECT collation_name FROM information_schema.columns WHERE TABLE_NAME = 'country';
此查询返回7行,但所有行都具有null或utf8_general_ci。
PHP代码: 请给予建议,谢谢。
7个回答

7
当您看到那个“带有问号的奇怪方块符号”,也称为 替换字符,通常表示您拥有80-FF(128-255)范围内的字节,并且系统正在尝试以UTF-8渲染它。
整个字节范围对于UTF-8中的单字节字符都是无效的,但在西方编码(如ISO-8859-1)中非常常见。
当我查看您的页面并手动将字符编码从UTF-8切换到ISO-8859-1(在Firefox中使用查看 >> 字符编码 >> 西方(ISO-8859-1)),然后英镑符号就会正确显示。

那么,问题出在哪里呢?很难说 - 可能是在数据库层面上。将表的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';

谢谢Peter - 我查看了这篇文章,并尝试了一些建议,例如SET character_set_client = utf8; set character_set_connection = utf8; - 但似乎并没有解决这个问题。我尝试了Tom Gullen的简单解决方案,看起来效果很好 - 为了快速解决,我已经用 £ 替换了数据库中的井号符号 - 我相信对于其他符号,我将再次遇到这个问题。 - Gublooo
谢谢你的指导,Peter - 我运行了查询并返回了C2A3 - 我还检查了字符集,我已经在我的问题中进行了编辑,所有字符集都正确设置为utf8。 - Gublooo
感谢您提供查询 - 非常感谢 - 我已经使用这些查询更新了上面的问题 - 谢谢。 - Gublooo
我注意到的另一件事是,当我在Windows上的本地主机上运行\s命令时,我会看到以下两个变量设置:Db characterset:utf8和Conn.characterset:utf8 - 但是当我在我的生产环境(Linux)上运行相同的命令时,这两个变量没有显示。不确定是否有任何差异。 - Gublooo
1
在选择查询语句之前尝试添加 mysql_set_charset('utf8', $con); - Peter Bailey
显示剩余9条评论

3

我来献上我的意见。我使用utf8_encode()函数来输出数据库中的数据。这个函数似乎也可以处理其他字符。


1

我也遇到了同样的问题。我的解决方法是在连接到数据库后(PHP)立即运行以下代码:

mysql_query("SET NAMES utf8");

希望这可以帮到您。

谢谢,这个对我有用!我之前尝试了很多其他在线找到的解决方案...但是对于我的情况都没有起作用。 - Tariq M Nasim

1

尝试使用

£

不要使用英镑符号,相反,在打印英镑符号的地方,请使用以下内容:

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

那只是一个权宜之计。那并不能解决他的数据库到浏览器字符编码问题。 - Peter Bailey
谢谢Tom,这个解决方案看起来相当简单,并且解决了手头的问题。但是我不确定我们是否有其他符号的替代品,例如欧元符号€或古巴货币₱或以色列货币₪。 - Gublooo
完整的实体列表: http://www.w3schools.com/tags/ref_entities.asp但是彼得是正确的,这只是一个临时解决方案。然而,现在我所有的网站都使用HTML实体来表示货币符号,因为这些符号似乎比其他符号更容易出问题,特别是在不同编辑器之间复制和粘贴代码时。 - Tom Gullen

1
我遇到了这个问题,并在输出阶段使用 "mb_convert_encoding" 解决。
使用你的例子... echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");

1

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接