Python 3: my unicode2shift-JIS скрипт работает кроме записи ASCII файла. Почему?

У меня есть файл с японским Юникодом, и я хочу преобразовать его в 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)

Это работает за исключением того, что когда я открываю кандзи.txt он всегда открывается как файл Ansi, а не Shift-JIS, и я вижу разные символы вместо японского. Если я вручную изменю кодировку файла на Shift-JIS, то символы misc превратятся в правильные японские символы. Для начала как сделать так, чтобы моя программа создала файл as Shift-JIS?

1 ответ

  1. «ANSI» — это термин корпорации Майкрософт для локализованной кодировки по умолчанию, которая зависит от используемой локализованной версии Windows. Программа Microsoft, такая как Notepad, предполагает «ANSI» для кодирования текстового файла, если он не начинается с метки порядка байтов. Блокнот Майкрософт recogizes спецификации 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)