Python 3: мой сценарий unicode2shift-jis работает, кроме записи файла ASCII. Зачем?
У меня есть файл с надписью Unicode на японском языке, и я хочу преобразовать его в Shift-JIS и распечатать в файл в формате Shift-JIS. Я сделаю это:
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, он всегда открывается как файл Ansi, а не Shift-JIS, и вместо японского я вижу разные символы. Если я вручную изменю кодировку файла на Shift-JIS, тогда символы misc превратятся в правильные японские символы. Как мне заставить мою программу создать файл как Shift-JIS для начала?
1 ответ
"ANSI" - это термин Microsoft для локализованной кодировки по умолчанию, который зависит от используемой локализованной версии Windows. Программа Microsoft, такая как Notepad, предполагает "ANSI" для кодирования текстового файла, если она не начинается с метки порядка байтов. Microsoft Notepad распознает спецификации UTF-8, UTF-16LE и UTF-16BE.
Shift-JIS - это локализованная кодировка, поэтому вы должны использовать редактор, такой как Notepad++, и вручную настроить его на Shift-JIS, как вы обнаружили. Файл, который вы написали, имеет кодировку Shift-JIS, но если у используемого вами редактора нет некоторой эвристики для обнаружения кодировки, его придется настраивать вручную. Вы также можете использовать японскую 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)