转换或删除"非法"Unicode字符

Oli*_*Oli 7 python unicode pymssql

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

然而,对于某些角色,它会爆炸.我得到这样的抱怨:

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

有没有什么方法可以将字符转换为正确的unicode版本?或剥去他们?

YOU*_*YOU 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) 
Run Code Online (Sandbox Code Playgroud)

测试

>>> "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'
Run Code Online (Sandbox Code Playgroud)

  • 即使使用'ignore',python也会抛出错误.似乎没有解码/编码的组合,我可以去除任何无用的UTF-8字符,我无法给出一点点狗屎. (12认同)

Ale*_*lli 11

一旦你有了字节串s,而不是直接用它作为unicode obj,用正确的编解码器明确地转换它,例如:

u = s.decode('latin-1')
Run Code Online (Sandbox Code Playgroud)

并使用u而不是s在此点之后的代码中(可能是写入sqlite的部分).这假设latin-1是用于最初生成字节字符串的编码 - 我们不可能猜测,所以试着找出;-).

作为一般规则,我建议:不要在应用程序中处理任何文本作为编码字节字符串 - 在输入后立即将它们解码为unicode对象,并且如果需要,在输出之前将它们编码回字节字符串.

  • 实际上,你必须知道你的文本是什么编码.这几乎没有办法解决这个问题.在您的情况下,幸运的是,您的错误消息使其显而易见.由于存在0x97字符,几乎可以肯定你正在处理微软烦人的cp1252.在latin-1中,此代码点包含一个控制字符,"END OF GUARDED AREA"几乎从未使用过.使用utf-8永远不会看到这个精确错误,因为0x97不是有效的字符前导字节.另一方面,在cp1252中,它是非常常见的emdash. (5认同)