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

标签: php mysql utf-8 mariadb iso-8859-1


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2019-05-23
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多