【问题标题】:Displaying database data encoded in ISO-8859-2 on UTF8 webpage在 UTF8 网页上显示以 ISO-8859-2 编码的数据库数据
【发布时间】:2015-04-23 06:12:40
【问题描述】:

我需要显示存储在 Postgresql 数据库中并以 SQL_ASCII 编码的数据(我无法更改数据库编码)。该应用程序是用 PHP 编写的(使用 Silex 框架和 Doctrine DBAL),通常在应用程序中使用的字符集是 UTF8。

有什么方法可以自动将数据从 ASCII 转换为 UTF8 编码并正确显示数据?

谢谢!

编辑:postgresql 数据库中的数据以 ISO-8859-2 编码存储。

【问题讨论】:

    标签: php postgresql encoding utf-8 silex


    【解决方案1】:

    UTF8 被刻意设计为与真正的 7 位 ASCII 兼容,因此这 128 个字符中的数据库中的任何字符都已经是有效的 UTF8,因此可以按原样使用。

    但是,正如the Postgres manual page on encodings 中所述,SQL_ASCII 字符集实际上并不拒绝 ASCII 范围之外的字符:

    当服务器字符集为 SQL_ASCII 时,服务器根据 ASCII 标准解释字节值 0-127,而字节值 128-255 被视为未解释字符。 ... 因此,此设置与其说是在使用特定编码的声明,不如说是对编码的无知的声明。

    因此,如果您的数据中有任何非 ASCII 字符,您需要知道它们存储在什么实际字符集中(例如 ISO 8859-15 或 Windows CP1252),并使用 @987654323 之类的东西将它们转换为 UTF8 @ 或mb_convert_encoding()

    【讨论】:

    • 这就是我害怕的... :) 是的,实际的字符集是 ISO-8859-2,首选的方法是自动进行转换。
    • @farfocello “自动”是相对的——它只是意味着它发生在你现在正在编写的代码之外。例如,可能有一种方法可以将转换逻辑添加到 DBAL 或 ORM 层。
    【解决方案2】:

    您可以使用函数iconv。 这个问题已经被here问过了。

    【讨论】:

    • 这是 PostgreSQL DB,不是 MySQL。
    • 使用iconv,您可以将由本地字符集表示的字符串转换为由另一个字符集表示的字符串。
    • 在指出现有/重复的问题时,最好将其作为评论而不是答案。一旦您拥有足够的声誉,您就可以投票正式将该问题标记为重复问题。
    • 我更喜欢即时进行转换,因为有很多地方我必须手动添加 iconv 转换。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2011-05-23
    • 2013-06-14
    • 2014-01-18
    • 2010-11-03
    • 2017-01-24
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多