Преобразование или удаление "незаконных" символов Юникода - PullRequest
7 голосов
/ 24 марта 2010

У меня есть база данных на MSSQL, которую я портирую на SQLite / Django. Я использую pymssql для подключения к базе данных и сохранения текстового поля в локальной базе данных SQLite.

Однако для некоторых персонажей он взрывается. Я получаю жалобы, как это:

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

Есть ли способ, как я могу преобразовать символы в правильные версии Unicode? Или раздеть их?

Ответы [ 2 ]

11 голосов
/ 24 марта 2010

Как только у вас есть строка байтов s, вместо того, чтобы использовать ее как объект unicode напрямую, конвертируйте ее явно с правильным кодеком, например ::10000 *

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

и используйте u вместо s в коде, который следует за этим пунктом (предположительно, часть, которая пишет в sqlite). Предполагается, что latin-1 - это кодировка, которая использовалась для первоначального создания строки байтов - мы не можем догадаться, поэтому попытайтесь выяснить; -).

Как правило, я предлагаю: не обрабатывайте в своих приложениях какой-либо текст как закодированные строки байтов - декодируйте их в объекты Unicode сразу после ввода и, при необходимости, кодируйте их обратно в строки байтов непосредственно перед выводом.

11 голосов
/ 24 марта 2010

Когда вы декодируете, просто пропустите '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) 

Test

>>> "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'
...