转换或剥离“非法”的Unicode字符

7 投票
2 回答
15969 浏览
提问于 2025-04-15 20:48

我有一个在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对象,如果需要的话,在输出前再编码回字节字符串。

撰写回答