【问题标题】:Replacing wrong codificaton letters with SQL用 SQL 替换错误的编码字母
【发布时间】:2012-01-01 06:55:16
【问题描述】:

我有一个包含来自互联网的数据的数据库,但有些页面的编码错误,并且像ã 这样的字母变成了ãç成为ç

有什么方法可以解决这个问题?我正在使用 PostgreSQL。

我可以使用替换,但我需要为每个案例做一个替换?我正在考虑翻译,但我看到它只将一个字符转换为另一个字符。是否可以将两个字符转换为一个?比如:TRANSLATE(text,'ã|ç','ã|ç')

【问题讨论】:

    标签: sql postgresql replace


    【解决方案1】:

    这个特殊问题看起来像您将 UTF-8 编码解释为单字节字符集(“ç”变成“ç”表示 iso-8859-1)。

    您可以通过一连串的replace(...) 调用单独解决这些问题。或者你可以使用 postgresql 自己的字符转换工具:

    select convert_from(convert_to('£20 - garçon', 'iso-8859-1'), 'utf-8')
    

    依次是:

    • 使用 iso-8859-1 编解码器将字符串转换回二进制(假设所有代码点都低于 256,这只会将 unicode 代码点改回字节)
    • 将二进制输出重新解释为 UTF-8,因此 {0xc2, 0xa3} 等序列被转换为“£”

    【讨论】:

    • 我认为这是最好的方法,但是有些无效字符无法转换,例如0xe7e36f0xefbfbd。如何识别具有这些无效字符的字符串并将其替换为 ?.? 等符号?
    • 不幸的是,postgresql 的转换器是严格的,不允许这样做...你可以编写一个 pl/perl 函数来使用 Perl 更宽松的转码例程吗?
    • \xe7e36f 在 iso-8859-1 中看起来像“ção” ...表明您混合了被错误解释的内容和被正确解释的内容。
    【解决方案2】:

    PostgreSQL 有字符串替换功能:

    replace(string text, from text, to text):用子字符串to替换子字符串string中出现的所有string

    例子:

    replace ('abcdefabcdef', 'cd', 'XX') ==> abXXefabXXef

    【讨论】:

      【解决方案3】:

      您可以通过替换某些字符来修复它们,但不是全部。通过使用错误的编码解码数据,您已经删除了一些信息,并且无法恢复。

      您应该找出这些页面的正确编码是什么,并在解码数据时使用它。

      有些页面在响应头中有编码,例如

      Content-Type: text/html; charset=utf8
      

      有些页面在 HTML 头部有编码,例如

      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
      

      如果信息不在标题中,您首先必须使用 ASCII 编码对页面(或至少一部分)进行解码(这不是问题,因为元标记不包含特殊字符),找出编码,然后使用正确的编码解码页面。

      【讨论】:

      • +1。尽管这不是对所提问题的回答,但从长远来看,这是需要完成的事情。
      • @jmz 是的,我知道这也是一件要做的事情,我在 Java 中使用的库对大多数页面都这样做,但我不确定它是否适用于所有情况,没有例外.另一种想法是,某些页面的原始内容可能会因页面的开发人员错误而出现错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2016-02-03
      • 2012-09-06
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多