转换或剥离“非法”的Unicode字符
我有一个在MSSQL里的数据库,现在想把它迁移到SQLite/Django上。我用的是pymssql这个工具来连接数据库,并把一个文本字段保存到本地的SQLite数据库里。
不过,有些字符在这个过程中出现了问题,导致程序崩溃。我收到了这样的错误信息:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128)
有没有什么办法可以把这些字符转换成正确的unicode格式?或者把它们去掉呢?
2 个回答
11
当你解码的时候,只需要传入'ignore'来去掉那些字符。
还有其他一些方法可以去掉或转换这些字符:
'replace': replace malformed data with a suitable replacement marker, such as '?' or '\ufffd'
'ignore': ignore malformed data and continue without further notice
'backslashreplace': replace with backslashed escape sequences (for encoding only)
测试
>>> "abcd\x97".decode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 4: ordinal not in range(128)
>>>
>>> "abcd\x97".decode("ascii","ignore")
u'abcd'
11
一旦你有了字节字符串 s
,不要直接把它当作unicode对象使用,而是要用正确的编码格式来明确转换,比如:
u = s.decode('latin-1')
接下来在代码中使用 u
代替 s
(假设这部分代码是写入sqlite的)。这里假设 latin-1
是最初用来生成字节字符串的编码方式——我们无法猜测,所以最好去确认一下;-)。
一般来说,我建议:在你的应用程序中,不要把任何文本当作编码的字节字符串来处理——在输入后立即将它们解码为unicode对象,如果需要的话,在输出前再编码回字节字符串。