正确的输出,网站是 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的主要内容,如果未能解决你的问题,请参考以下文章