2

我有一个带有CLEditor 富文本控件的 PHP 网站。当我尝试将欧元和英镑写入数据库时​​,该字符运行良好,因为我在包含页面 HTML、富文本控件 IFRAME HTML 和 MySQL 表排序规则中将字符集设置为 UTF-8。在这方面一切都很好。但是,当我尝试编写智能引号时,我最终会在数据库中看到以下输出:

This is a “testâ€.

(如果在您的浏览器上方没有正确显示,则测试词的前面有拉丁语 a、欧元符号和小 AE 符号,后面是拉丁语 a 和欧元符号。 )

当我使用 PHP 从数据库中读取该值以将其显示在页面上时,它最终显示为带有问号的黑色菱形以及一些其他拉丁字符。

我应该怎么做才能解决这个问题?

4

4 回答 4

3

首先,确保您的 MySQL 表使用 UTF-8 作为其编码。如果是,它将如下所示:

mysql> SHOW CREATE TABLE Users (
...
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 |

接下来,确保您的 HTML 页面设置为显示 UTF-8:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    </head>
    ....
</html>

然后它应该工作。


编辑:我故意不谈论排序规则,因为我认为它已经被考虑过了,但是为了大家的利益,让我在这个答案中添加更多内容。

你说,

我在 MySQL 表排序规则中将字符集设置为 UTF-8 ...。

表排序规则与字符集不同。

Collat​​ion 是为了 QUERYING 的目的自动尝试将一个字符集转换为另一个字符集的行为。例如,如果您有一个 latin1 字符集和一个 UTF-8 排序规则,并且您执行类似 SELECT * FROM foo WHERE bar LIKE '%—%'; 之类的操作。(UTF-8 U+2014) 在具有 latin1 字符集的表上匹配 L+0151U+2014。

并非如此巧合...如果您将此 latin1 编码的字符输出到 UTF-8 编码的网页上,您将得到以下信息:

这是一个“测试”。

确切地说,这似乎是您的问题的输出。这是复制它的 HTML:

<?php
$string = "This is a “test”.";
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf8"/>
    </head>
    <body>
        <p><?php echo $string; ?></p>
    </body>
</html>

确保将此文件保存在 latin1...

要查看您的表设置的字符集,请运行以下查询:

SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T,
       information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
  AND T.table_schema = "database"
  AND T.table_name = "table";

唯一适合您使用的结果(除非您使用多种非英语语言)是:

+--------------------+-----------------+
| character_set_name | TABLE_COLLATION |
+--------------------+-----------------+
| utf8               | utf8_general_ci |
+--------------------+-----------------+

感谢您的支持;-)

于 2012-01-22T19:54:31.993 回答
0

在打印任何内容之前,确保您的 PHP 文件在顶部有这个。我可以将 latin_swedish_ci 带入一个 utf8 编码的网站,它可以正确编码。

header("Content-type: text/html;charset=UTF-8");

我也把它放在我的数据库连接之后(不确定这是否同样重要):

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

于 2014-01-16T21:14:07.307 回答
0

对于阅读这篇文章的其他人来说,我发现添加这些 mysqld 配置行 - 如果您可以访问 mysql 服务器并且可以进行更改 - 解决了我的弯引号问题。

http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

# Force UTF8 Charset Encoding
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8

我已经仔细检查了从 PHP 调用的 SQL(看起来很好),并且还从我的 GUI 中手动执行了带有花括号的插入/更新语句(工作正常),但是仍然从 Web 服务器获得了多控制插入数据库的字符。

我检查了我的 mysql 服务器变量并注意到 latin1 是服务器和数据库的默认值(即使表/列是 UTF8)。一旦我添加了上面的行并刷新了发出更新语句的页面,花括号确实插入正确。我只能假设这与我们服务器的默认字符集为 latin1 和 Web 服务器 mysql 库握手协商有关。

于 2015-06-07T04:16:20.623 回答
0
于 2022-01-11T00:56:54.597 回答