Мой процесс связан с искаженными данными. Я могу сказать, что он был дважды закодирован в UTF-8, но это только половина дела. Двойное декодирование работает только для кодовых точек, которые являются однобайтовыми (латинскими) и которые проходят через UTF-8 без потерь. Двухбайтовые (или большие) кодовые точки не могут быть дважды декодированы с использованием .decode('utf-8').encode('raw_unicode_escape').decode('utf-8')
У меня есть пример, который поможет понять это. Одна из строк, через которые я прошел, это:
'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae\xc3\xa2\xe2\x80\x9e\xc2\xa2'
Это должно разрешить до:
u'\xa9\xae\u2122'
Первые две кодовые точки для символов (c) и (r) не нуждаются в суррогатных парах и поэтому очень явно присутствуют в необработанных байтах. Однако последний символ, символ (tm), является 16-битной кодовой точкой и искажается любым процессом, который это сделал.
Если я отрежу строку до этой точки, то смогу успешно дважды декодировать:
'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae'.decode('utf-8').encode('raw_unicode_escape').decode('utf-8')
Однако, это не работает для всей строки, потому что первое декодирование приводит к этому:
u'\xc2\xa9\xc2\xae\xe2\u201e\xa2'
Может кто-нибудь указать мне правильное направление для решения этой проблемы? Тем временем я продолжу тыкать в это и посмотрю, смогу ли я понять это.