У вас есть строки Mojibake; текст, закодированный одним (правильным) кодеком, а затем декодированный другим.
В этом случае ваш текст был декодирован с использованием кодовой страницы Windows 1252; U+20AC EURO SIGN в тексте типичен для моджибаке CP1252. Исходная кодировка может быть одной из семейства кодировок GB* для китайского языка или кодировкой UTF с множественной передачей туда и обратно. -8 - CP1252 Моджибаке. Какой из них я не могу определить, я не могу читать по-китайски, и у меня нет ваших полных данных; CP1252 Mojibakes включает непечатаемые символы, такие как байты 0x81 и 0x8D, которые могли быть потеряны, когда вы разместили свой вопрос здесь.
Я бы установил проект ftfy
; он не исправит кодировку GB * (я запросил проект добавить поддержку) , но он включает новый кодек sloppy-windows-1252
, который позволит вам отменить ошибочное декодирование с помощью этого кодека:
>>> import ftfy # registers extra codecs on import
>>> text = u'袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥ÂÂå•â€'
>>> print text.encode('sloppy-windows-1252').decode('gb2312', 'replace')
猫垄�姑�⑩dcx�盲赂沤忙��姑ヂ�姑ぢ宦�р�得ヂ�氓�⑩�
>>> print text.encode('sloppy-windows-1252').decode('gbk', 'replace')
猫垄鈥姑�⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦�р�得ヂ�氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('gb18030', 'replace')
猫垄鈥姑⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦р�得ヂ氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('utf8', 'ignore').encode('sloppy-windows-1252').decode('utf8', 'replace')
袋�dcx与朋�们���
�
U+FFFD REPLACEMENT CHARACTER показывает, что декодирование не было полностью успешным, но это может быть связано с тот факт, что в вашей скопированной строке здесь отсутствует что-либо, что не может быть напечатано или использует байты 0x81 или 0x8D.
Вы можете попытаться исправить свои данные таким образом; из файловых данных, попробуйте декодировать в один из кодеков GB* после кодирования в sloppy-windows-1252
или дважды выполните двустороннюю передачу из UTF-8 и посмотрите, что подходит лучше всего.
Если этого недостаточно (вы не можете исправить данные), вы можете использовать ftfy.badness.sequence_weirdness()
function, чтобы попытаться обнаружить проблему:
>>> from ftfy.badness import sequence_weirdness
>>> sequence_weirdness(text)
9
>>> sequence_weirdness(u'元大寶來證券')
0
>>> sequence_weirdness(u'John Dove')
0
Моджибаке получили высокие оценки по шкале странности последовательности. Вы могли бы попытаться найти подходящий порог для ваших данных, к которому вы могли бы назвать данные, которые, скорее всего, будут повреждены.
Однако я думаю, что мы можем использовать ненулевое возвращаемое значение в качестве отправной точки для другого теста. Английский текст должен получить 0 баллов по этой шкале, как и текст на китайском языке. Китайский, смешанный с английским, по-прежнему может получить более 0 баллов, но вы не сможете затем закодировать этот китайский текст в кодек CP-1252, в то время как вы можете с поврежденным текстом:
from ftfy.badness import sequence_weirdness
def is_valid_unicode_str(text):
if not sequence_weirdness(text):
# nothing weird, should be okay
return True
try:
text.encode('sloppy-windows-1252')
except UnicodeEncodeError:
# Not CP-1252 encodable, probably fine
return True
else:
# Encodable as CP-1252, Mojibake alert level high
return False
person
Martijn Pieters
schedule
16.03.2015
codecs.open()
уже декодировал их в строки Unicode, потому что ваш файл был единообразно закодирован в UTF-8. - person Martijn Pieters   schedule 16.03.2015ftfy
, чтобы узнать, что он может сделать, чтобы разобраться в имеющихся у вас строках. - person Martijn Pieters   schedule 16.03.2015猫垄姑⑩dcx盲赂沤忙姑ヂ姑ぢ宦р得ヂ氓⑩
или猫垄鈥姑⑩dcx盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦р得ヂ氓鈥⑩
или猫垄鈥姑⑩dcx盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦р得ヂ氓鈥⑩
(GB2312, GBK и GB18030) из вашего моджибаке. Буду смотреть дальше. - person Martijn Pieters   schedule 16.03.2015print repr(broken_value)
? Таким образом, любые непечатаемые байты и байты, отличные от ASCII, будут включены в качестве управляющих последовательностей, что позволит нам точно воссоздать значение. - person Martijn Pieters   schedule 16.03.2015ftfy
стало ясно, что мое предположение о том, что у вас есть Mojibake с кодировкой GB*, может быть неверным; это также может быть двойной CP1252 - UTF8 Mojibake. Мне было бы очень интересно увидеть здесь вывод строкиrepr()
, чтобы у нас были все байты. На данный момент мой лучший декод с этим предположением относится к袋dcx与朋们
. - person Martijn Pieters   schedule 16.03.2015