我有一个小JSON对象,我想发送到php放入mySQL数据库。字符串中的部分信息是html实体。 &emdash
给了我一些问题。它显示为â€
。 é
显示为é
时还存在其他一些问题。
我似乎遇到了一些编码问题。知道什么可能是错的吗?感谢
答案 0 :(得分:2)
由于数据来自JSON,因此应使用Unicode字符集进行编码,默认值为UTF-8 [来源:Douglas Crockford,RFC4627] 。
这意味着为了在数据库中存储非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类型的上下文中都有意义。
另外,请确保validate your markup。