Восстановление искаженного китайского формата и определение оригинальной китайской кодировки
Я работаю с файлом, который читает содержимое китайской Википедии и, по-видимому, каким-то образом преобразован в UTF-8, но не правильно.
import re,urllib
st=u'1492: Conquest ▒�¢â▒��¬â▒�▒¹of Paradise'
st1= urllib.unquote(st).encode('UTF-8')
st2= urllib.unquote(st)
print st
print st1
print st2
Выход
1492: Conquest ▒�¢â▒��¬â▒�▒¹of Paradise
1492: Conquest ▒�¢â▒��¬â▒�▒¹of Paradise
1492: Conquest ▒�¢â▒��¬â▒�▒¹of Paradise
РЕДАКТИРОВАТЬ (дополнительная информация найдена)
Я узнал, что оригинальный формат (каким бы он ни был) прошел следующий процесс преобразования
line[1]=urllib.quote(line[1])
try:
st=urllib.unquote(line[1]).decode("utf-8")
except UnicodeDecodeError:
st=urllib.unquote(line[1]).decode("latin1")
Я не знаю оригинальную кодировку (вероятно, GBK или GB18030), поэтому я не уверен, как восстановить правильный текст. Это восстановимо?
1 ответ
Учитывая код, который вы показываете, чтобы декодировать входящие байты...
Вероятно, что попытка декодировать байты из utf-8
потерпит неудачу, поскольку существует так много байтовых комбинаций, которые недопустимы в utf-8. Таким образом, ваша строка Unicode, вероятно, пришла из декодирования latin1
вместо.
Есть также много байтов, которые не являются допустимыми латинскими символами 1, но быстрый тест в Python 2.7 показывает, что он все равно их декодирует. Это означает, что входные байты были сохранены, но print
не смог их отобразить.
for x in range(256):
if chr(x).decode('latin1').encode('latin1') != chr(x):
print x
Следующее должно быть в состоянии восстановить их и декодировать в правильную кодовую страницу, если вы поместите правильную кодовую страницу в decode
часть:
st1 = st.encode('latin1').decode('gb18030')
print st1