Восстановление искаженного китайского формата и определение оригинальной китайской кодировки

Я работаю с файлом, который читает содержимое китайской Википедии и, по-видимому, каким-то образом преобразован в 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
Другие вопросы по тегам