У меня есть база данных в MSSQL, который я портирую на SQLite/Django. Я использую pymssql, чтобы соединиться с базой данных и сохранить текстовое поле к локальной базе данных SQLite.
Однако для некоторых символов, это взрывается. Я получаю жалобы как это:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128)
Есть ли некоторый способ, которым я могу преобразовать символы в надлежащие unicode версии? Или разделите их?
Как только у вас будет строка байтов s
, вместо того, чтобы использовать ее в качестве юникода obj напрямую, преобразуйте ее явно с правильным кодеком, например:
u = s.decode('latin-1')
и используйте u
вместо s
в коде, который следует за этим пунктом (предположительно, часть, которая записывает в sqlite). Это предполагает, что latin-1
- это кодировка, которая использовалась для создания байтовой строки изначально - нам невозможно догадаться, поэтому попытайтесь выяснить ;-).
Как правило, я предлагаю: не обрабатывайте в своих приложениях текст в виде закодированных байтовых строк - декодируйте их в объекты Unicode сразу после ввода и, при необходимости, кодируйте их обратно в байтовые строки прямо перед выводом.
При декодировании просто передайте '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'