我从 latin1 更改为 utf8。尽管各种文本都显示得很好,但我注意到非英语字符作为奇怪的符号存储在数据库中。我花了一天时间试图解决这个问题,最后现在非英文字符在数据库中显示为非英文字符,并在浏览器上显示相同。但是,我注意到我看到撇号存储为'
,感叹号存储为!
. 这是正常的,还是应该显示为 ' 和 !而不是在数据库中?如果是这样,我需要做什么来解决这个问题?
2 回答
&#XX;
表单是HTML 字符实体,这意味着您通过 PHPhtmlspecialchars
或htmlentities
. 如果值是在 HTML 文档中处理的(或者可能由任何 HTML 处理器处理,无论它们属于什么部分),它们应该可以正常显示。除此之外,他们不会。
这意味着您可能不想将它们编码为 HTML 实体。您可以使用与用于对它们进行编码的函数(例如html_entity_decode
)的对应项将值转换回,该函数应接受关于要转换为哪种编码的参数。完成后,检查一些以前有问题的条目,确保使用正确的编码来查看它们。
如果您仍然遇到问题,则存储值应该使用的编码与它们实际使用的编码不匹配。您必须弄清楚它们实际使用的是什么,然后通过从数据库中提取它们并在重新插入它们之前将它们转换为目标编码,或者使用它们实际使用的编码重新插入它们来转换它们. 类似于后一种选择是将列转换为BLOB
s,然后更改列字符集,然后将列类型更改回文本类型,然后直接将列转换为所需的字符编码。这种笨拙序列的原因是文本类型在更改字符编码时被转换,但二进制类型不是。
阅读“每个软件开发人员绝对、肯定地必须了解 Unicode 和字符集(没有任何借口!) ”以了解有关字符编码的更多信息,以及第 9.1.4 节。MySQL 手册中的“连接字符集和排序规则”,了解如何在 MySQL 中使用编码。
这实际上取决于您打算如何处理数据库的内容。如果您的不变量是“数据库的内容已经过清理,并且可以直接放置在网页中而无需进一步验证/清理”,那么具有 & 和数据库中的其他 html 实体非常有意义。另一方面,如果您的数据库仅存储原始原始数据,并且您打算在将其显示为 HTML 代码之前对其进行处理/清理,那么您可能应该将这些实体替换为使用 UTF 编码的原始字符-8。因此,这实际上取决于您如何解释数据库内容。