【问题标题】:How to detect malformed UTF characters如何检测格式错误的 UTF 字符
【发布时间】:2008-10-15 09:57:28
【问题描述】:

我想在使用 SQL*Loader 加载数据时使用 Perl 脚本检测并用空格替换格式错误的 UTF-8 字符。我怎样才能做到这一点?

【问题讨论】:

    标签: perl utf-8 character-encoding


    【解决方案1】:

    考虑 Python。它允许使用用户定义的错误处理程序扩展编解码器,因此您可以用您想要的任何内容替换不可解码的字节。

    import codecs
    codecs.register_error('spacer', lambda ex: (u' ', ex.start + 1))
    s = 'spam\xb0\xc0eggs\xd0bacon'.decode('utf8', 'spacer')
    print s.encode('utf8')
    

    打印出来:

    spam  eggs bacon
    

    【讨论】:

      【解决方案2】:

      编辑:(删除了一些关于 SQL Loader 的内容,因为它似乎不再相关。)

      其中一个问题是要弄清楚什么是格式错误的 UTF-8 字符的“结束”。说什么是非法的很容易,但下一个合法字符从哪里开始可能并不明显。

      【讨论】:

      • 查找下一个字符的开始位置很容易——这是 UTF-8 设计中非常酷的事情之一。 tools.ietf.org/html/rfc3629
      • 只在格式良好的 UTF-8 中简单。想象一个重复的前导字节被插入 - 你将不得不跳过第一次出现。如果您只是遵循 UTF-8 规则,则下一个字符似乎从其前导字节重复的字符的最后一个字节开始。
      • @MSalters:这就是我正在考虑的事情,但我对自己不够自信:)
      【解决方案3】:

      RFC 3629 描述了 UTF-8 字符的结构。如果你看一下,你会发现找到无效字符非常简单,并且下一个字符边界总是很容易找到(它是一个小于 128 的字符,或者是“长字符”开始标记之一,前导位为 110、1110 或 11110)。

      但 BKB 可能是正确的 - 最简单的答案是让 perl 为你做这件事,虽然我不确定 Perl 在检测到不正确的 utf-8 并使用该过滤器时会做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多