【发布时间】:2021-10-09 14:46:41
【问题描述】:
我正在为一个我无法真正更改的现有数据库编写一个 Web 界面。 数据库使用排序规则 latin1_swedish_ci。 对于页面,我使用 UTF-8 作为字符集。
在 PHP 中连接到数据库时,我使用 set_charset("utf8") 并在 HTML 头中定义 content="text/html; charset=UTF-8"。
有了这个,一切正常,但在某些情况下,符号没有按预期出现。值得注意的是 ü 在浏览器中显示为正方形 () 和 £ 显示为 –。
我尝试在连接和定义 Win-1252、ISO-8859-1 或 HTML 中的任何内容时不设置字符集,但最终会导致更多字符丢失,有时晚上查询会失败...
关于如何处理这些挣扎的符号有什么想法吗?
【问题讨论】:
-
您不能将 UTF8 作为 UTF8 存储在 latin1 表中。如果您真的无法升级到 UTF8,您可以将 UTF8 字符转换为实体。例如而不是
ü存储ü -
除了 user3783243 的评论,MySQL 的 UTF8 并不是真正的 UTF8,因为它只支持前三个字节,所以如果您可以更改架构,请改用 UTF8MB4。
-
除了user3783243:警告如果你转义或添加实体,任何搜索或其他数据使用可能会中断(例如,双重转义&因为它是用户输入等)。我真的建议您说服更新数据库。现在 web 是 UTF-8(不仅仅是默认的,它实际上是标准的:只允许 utf-8)。说服:表情符号不能存储在 Latin1 中。 [但对表情符号使用 UTF8MB4]。在线查看如何更改字段的编码(无需重新创建数据库,或使用临时表/字段,或关闭数据库)]
标签: php mysql utf-8 mariadb iso-8859-1