php没有编码em破折号(正确地);

时间:2012-08-29 15:39:01

标签: php html-entities html-encode

我有一个小JSON对象,我想发送到php放入mySQL数据库。字符串中的部分信息是html实体。 &emdash给了我一些问题。它显示为â€é显示为é时还存在其他一些问题。

我似乎遇到了一些编码问题。知道什么可能是错的吗?感谢

1 个答案:

答案 0 :(得分:2)

由于数据来自JSON,因此应使用Unicode字符集进行编码,默认值为UTF-8 [来源:Douglas CrockfordRFC4627]

这意味着为了在数据库中存储非ASCII字符,您需要将传入数据的编码转换为数据库的字符集,或者(最好)使用Unicode字符集数据库。最常见的Unicode字符集 - 我建议你用于此目的 - 是UTF-8。

您的数据库可能设置了一个拉丁字符集(ISO-8859-*),在这种情况下,您很可能只需要更改用于表的字符集,而不会打破任何现有数据 - 假设您当前没有使用低于128的任何字符的记录。根据您的上述评论,您应该能够使用phpMyAdmin进行此更改 - 您需要确保更改每个现有数据您希望显式更改的列,更改表/数据库的字符集只会影响在未指定字符集的情况下创建的新列/表。

当您向客户端输出数据时,您还需要告诉它您正在输出UTF-8,以便它知道如何正确显示字符。为此,您可以确保将; charset=utf-8附加到与基于文本的内容一起发送的Content-Type:标题中。

例如,在生成使用UTF-8编码的HTML的PHP​​脚本的顶部,您可以添加以下行:

header('Content-Type: text/html; charset=utf-8');

还建议您在文档中声明文档的字符集。此声明必须出现之前文档中存在的任何非ascii字符 - 因此,建议您将以下<meta>标记作为{{1的第一个子标记}}:

<head>

如果您在顶部生成带有XML声明的XHTML,则可以在那里声明字符集,而不是使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 标记:

<meta>

请记住,<?xml version="1.0" encoding="UTF-8" ?> 标头中字符集定义的使用不仅限于Content-Type: - 在任何text/html系列MIME类型的上下文中都有意义。

进一步阅读:What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

另外,请确保validate your markup