2017-02-07 9 views
0

У меня есть якобы юникод строку, как это:Python - преобразовать юникод и шестигранник в юникод

и '\ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ xA9 \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ u201c \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ xA9 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xa4 \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ u201c \ xc3 \ XAF \ xc2 \ XBC \ xc2 \ x81 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xb9 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ XAF \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ XBC \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ Xab \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xa2 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xa4 \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ XB0 \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ Xab \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ xa2 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xa7 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xb9 \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ xa0 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ XA3 \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ x90 \ xc3 \ XA3 \ xc6 \ u2019 \ xc2 \ Xab \ xc3 \ XAF \ xc2 \ XBC \ х центибар \ u2020 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xb9 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ XAF \ xc3 \ XA3 \ xc6 \ u2019 \ XE2 \ u20ac \ xa2 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xa7 \ xc3 \ XA3 \ XE2 \ u20ac \ u0161 \ xc2 \ xb9 \ xc3 \ XAF \ xc2 \ XBC \ XE2 \ u20ac \ XB0'

Как получить правильный unicode string из этого? Я думаю, фактическое значение unicode равно ラブライブ!スクールアイドルフェスティバル(スクフェス)

+2

Это кракозябры. Как вы получили эту ценность? Он неправильно декодирован. –

+0

Вы путаетесь в значении «строки Unicode». –

+1

Еще лучше, это было искажено ** дважды **. UTF-8, декодируется как CP1252, затем снова закодирован как UTF-8, а затем снова декодируется как CP1252. Довольно подвиг! –

ответ

5

У вас есть Mojibake, текст с неправильной декодировкой.

Вы можете использовать ftfy library, чтобы не-делать повреждения:

>>> from ftfy import fix_text 
>>> fix_text(s) 
u'\u30e9\u30d6\u30e9\u30a4\u30d6!\u30b9\u30af\u30fc\u30eb\u30a2\u30a4\u30c9\u30eb\u30d5\u30a7\u30b9\u30c6\u30a3\u30d0\u30eb(\u30b9\u30af\u30d5\u30a7\u30b9)' 
>>> print fix_text(s) 
ラブライブ!スクールアイドルフェスティバル(スクフェス) 

Согласно ftfy, данные закодированного в UTF-8, а затем декодируется как Windows, кодовая страница 1252; ftfy.fixes.fix_one_step_and_explain() function показывает этапы ремонта необходимы:

>>> ftfy.fixes.fix_one_step_and_explain(s)[-1] 
[(u'encode', u'sloppy-windows-1252', 0), (u'decode', u'utf-8', 0)] 

('sloppy' encoding необходим потому, что не все в UTF-8 байты можно расшифровать как cp1252, но некоторые плохие декодеры затем просто скопировать исходные байты, специальный кодек переворачивает этот процесс).

В самом деле, в вашем случае это было сделано дважды, не подвиг я видел раньше:

>>> print s.encode('sloppy-cp1252').decode('utf8').encode('sloppy-cp1252').decode('utf8') 
ラブライブ!スクールアイドルフェスティバル(スクフェス) 
+0

Awesome, ftfy работает. Я получил это значение от API. Мне сказали, что в PHP используется следующая функция. mb_convert_encoding ($ program_name, 'UTF-8', 'UTF-8'); – Sri

+0

@Sri: они многое сделали для этого; повторное кодирование от UTF-8 до UTF-8 в любом случае является no-op. –

+1

Я вижу. Я перенаправил URL этой страницы клиенту. Надеюсь, он это исправит. – Sri