2016-11-01 16 views
0

У меня есть файл с японской записью в Юникоде, и я хочу преобразовать его в Shift-JIS и распечатать его в Shift-JIS закодированном файле. Я делаю это:Python 3: работает мой скрипт unicode2shift-jis, кроме файла ASCII. Зачем?

with open("unikanji.txt", 'rb') as unikanjif: 
    unikanji = unikanjif.read() 

sjskanji = unikanji.decode().encode('shift-jis') 

with open("kanji.txt", 'wb') as sjskanjif: 
    sjskanjif.write(sjskanji) 

Он работает за исключением того, что когда я открываю kanji.txt всегда открывается как файл Анси, не Shift-JIS, и я вижу MISC символы вместо японского языка. Если я вручную изменю кодировку файла на Shift-JIS, то разные символы превратятся в правильные японские символы. Как мне заставить мою программу создать файл как Shift-JIS для начала?

+0

Возможно, вы захотите прочитать [ask] и [mcve]. – boardrider

+0

Это проблема с тем, как вы открываете выходной файл для чтения, а не с кодом, который отлично записывает текст с кодировкой shift-jis. Независимо от того, какой текстовый редактор вы используете, он не правильно определяет кодировку, но это не проблема с файлом или кодом, который его создает. – Blckknght

ответ

0

«ANSI» - это термин Microsoft для локализованного кодирования по умолчанию, который зависит от локализованной версии используемой Windows. Программа Microsoft, такая как Notepad, предполагает «ANSI» для кодирования текстового файла, если только она не начинается с знака порядка байтов. Microsoft Notepad перерабатывает спецификации UTF-8, UTF-16LE и UTF-16BE.

Shift-JIS - это локализованная кодировка, поэтому вы должны использовать такой редактор, как Notepad ++, и вручную настроить его на Shift-JIS, как вы обнаружили. Файл, который вы его написали : Shift-JIS-encoded, но если редактор, который вы используете, не имеет эвристики для обнаружения кодировки, он должен быть настроен вручную. Вы также можете использовать японскую Windows или изменить свою локализацию по умолчанию в текущей версии Windows, а Shift-JIS может быть стандартным ANSI.

Кстати, конвертирование кодировок может быть немного более простым. Ниже предполагается, что исходный файл UTF-8 и целевой файл будет shift-jis. utf-8-sig автоматически обрабатывает и удаляет знак порядка байтов, если он присутствует.

with open('unikanji.txt',encoding='utf-8-sig') as f: 
    text = f.read() 

with open('kanji.txt','w',encoding='shift-jis') as f: 
    f.write(text)