【发布时间】:2008-10-15 09:57:28
【问题描述】:
我想在使用 SQL*Loader 加载数据时使用 Perl 脚本检测并用空格替换格式错误的 UTF-8 字符。我怎样才能做到这一点?
【问题讨论】:
标签: perl utf-8 character-encoding
我想在使用 SQL*Loader 加载数据时使用 Perl 脚本检测并用空格替换格式错误的 UTF-8 字符。我怎样才能做到这一点?
【问题讨论】:
标签: perl utf-8 character-encoding
考虑 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
【讨论】:
编辑:(删除了一些关于 SQL Loader 的内容,因为它似乎不再相关。)
其中一个问题是要弄清楚什么是格式错误的 UTF-8 字符的“结束”。说什么是非法的很容易,但下一个合法字符从哪里开始可能并不明显。
【讨论】:
RFC 3629 描述了 UTF-8 字符的结构。如果你看一下,你会发现找到无效字符非常简单,并且下一个字符边界总是很容易找到(它是一个小于 128 的字符,或者是“长字符”开始标记之一,前导位为 110、1110 或 11110)。
但 BKB 可能是正确的 - 最简单的答案是让 perl 为你做这件事,虽然我不确定 Perl 在检测到不正确的 utf-8 并使用该过滤器时会做什么。
【讨论】: