декодирование shift-jis: «недопустимая многобайтовая последовательность» - PullRequest
6 голосов
/ 18 июля 2011

Я пытаюсь декодировать строку, закодированную в shift-jis, например:

string.decode('shift-jis').encode('utf-8')

чтобы просмотреть его в моей программе.

Когда я сталкиваюсь с 2 символами shift-jis, в гексах "0x87 0x54" и "0x87 0x55", я получаю эту ошибку:

UnicodeDecodeError: 'shift_jis' codec can't decode bytes in position 12-13: illegal multibyte sequence

Но я уверен, что это действительные символы shift-jis: http://www.rikai.com/library/kanjitables/kanji_codes.sjis.shtml

Я также заметил, что эти символы отображаются в виде черных ящиков в моем текстовом редакторе shift-jis, что означает, что они не распознаются. Так что в этих двух символах есть что-то особенное, что заставило мой редактор и Python-декодер выйти из строя. Помощь

(извините, я не смог опубликовать пример строки, потому что, когда эти символы присутствуют, он не добавляется в буфер обмена с этого момента, а также автоматически конвертируется в юникод. Хотя я опубликовал шестнадцатеричные значения для них. )

Ответы [ 2 ]

8 голосов
/ 18 июля 2011

Существует несколько версий Shift JIS. Кодек shift_jis - JIS X 0208 , тогда как эта таблица - JIS X 0213 , что соответствует кодеку shift_jisx0213.

>>> u'⑲⑳Ⅰ'.encode('shift_jisx0213')
'\x87R\x87S\x87T'
0 голосов
/ 22 марта 2019

Shift_JISx0213 не используется в реальном мире. Это просто используется для демонстрации самого себя, ИМХО. Windows не может справиться с этим. Набор символов JIS X 0213 в большинстве случаев используется с Юникодом, но не с Shift_JIS.

Используйте 'cp932' (в Python 3).

. / Sjis.txt содержит

5c  7e  87  52  87  53  87  54  87  8a  fa  b1  fb  50  fb  fc

(они сохраняются в Windows 10)

>>> import codecs
>>> codecs.open('sjis.txt',"rb",'shift_jis').read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/codecs.py", line 700, in read
    return self.reader.read(size)
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 2: illegal multibyte sequence
>>> codecs.open('sjis.txt',"rb",'shift_jisx0213').read()
'¥‾⑲⑳Ⅰ㈱郫鍚騠'
>>> codecs.open('sjis.txt',"rb",'cp932').read()
'\\~⑲⑳Ⅰ㈱﨑瀨髙'

Символы и последние 3 кандзи интерпретируются по-разному.

...