我在MSSQL中有一个数据库,我正在移植到SQLite / Django。我正在使用pymssql连接到数据库并将文本字段保存到本地SQLite数据库。
然而对于某些角色来说,它会爆炸。我得到这样的抱怨:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128)
有没有什么方法可以将字符转换为正确的unicode版本?或剥去它们?
答案 0 :(得分: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'
答案 1 :(得分:11)
一旦你有了字符串s
,而不是直接用它作为unicode obj,用正确的编解码器明确地转换它,例如:
u = s.decode('latin-1')
并在此后的代码中使用u
而不是s
(可能是写入sqlite的部分)。假设latin-1
是用于最初生成字节字符串的编码 - 我们无法猜测,因此请尝试查找; - )。
作为一般规则,我建议:不要在应用程序中处理任何文本作为编码字节字符串 - 在输入后立即将它们解码为unicode对象,如果需要,在输出之前将它们编码回字节字符串。