正确的输出,网站是 utf-8,mysql 是 latin1_swedish_ci

Posted

技术标签:

【中文标题】正确的输出,网站是 utf-8,mysql 是 latin1_swedish_ci【英文标题】:Proper output, website is utf-8, mysql is latin1_swedish_ci 【发布时间】: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]。在线查看如何更改字段的编码(无需重新创建数据库,或使用临时表/字段,或关闭数据库)] 【参考方案1】:

您正在将字符集 cp850 与 latin1 混合。 Hex 9C 是 cp850 中的磅符号,并且 latin1 或 cp1256(非 1252)中的拉丁文小连字 OE

                                    cp850   2  1 '£'
                           cp1256, latin1   2  1 'œ'

确保使用客户端正在使用的字符集连接到数据库。然后保持一致。

【讨论】:

以上是关于正确的输出,网站是 utf-8,mysql 是 latin1_swedish_ci的主要内容,如果未能解决你的问题,请参考以下文章

mysql显示汉字

如何让 MySQL 返回 UTF-8?

如何让 MySQL 正确处理 UTF-8

php mysql 编码问题

将 UTF-8 编码的字符串插入 UTF-8 编码的 mysql 表失败​​,并显示“字符串值不正确”

我的 PHP 应用程序是不是正确支持 UTF-8?