7

我在 MSSQL 中有一个数据库,我正在移植到 SQLite/Django。我正在使用 pymssql 连接到数据库并将文本字段保存到本地 SQLite 数据库。

但是对于某些角色,它会爆炸。我收到这样的投诉:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128)

有什么方法可以将字符转换为正确的 unicode 版本吗?还是把它们剥掉?

4

2 回答 2

11

解码时,只需传递“忽略”即可去除这些字符

还有更多剥离/转换的方法是

'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'
于 2010-03-24T15:18:08.243 回答
11

一旦你有了 bytes 字符串s,而不是直接将其用作 unicode obj,而是使用正确的编解码器显式转换它,例如:

u = s.decode('latin-1')

并在这一点之后的代码中使用u而不是s(大概是写入sqlite的部分)。假设latin-1是最初用于制作字节字符串的编码——我们不可能猜到,所以试着找出来;-)。

作为一般规则,我建议:不要在您的应用程序中将任何文本作为编码字节字符串处理——在输入之后立即将它们解码为 un​​icode 对象,如果有必要,在输出之前将它们编码回字节字符串。

于 2010-03-24T15:22:13.503 回答