Преобразование устаревшей японской кодировки с помощью Red

В этом посте я рассказываю о кодировании с помощью языка программирования Red. Репозиторий находится здесь. Red обладает отличными возможностями по разбору и преобразованию строковых/бинарных данных. Надеюсь, этот пост поможет вам понять возможности Red!

Кодирование — это проклятие в Японии

Этот параграф объясняет не кодировки, а японский культурный контекст. Пропустите, если вам это не интересно.

Японцы, вероятно, одни из самых страдающих от проблем с кодировкой людей в мире. У нас есть 3 традиционных типа символов — хирагана, катакана и кандзи — и даже уникальные символы, такие как ♨(горячий источник) и эмодзи! Особенно кандзи имеют слишком много символов. Например, , и имеют семантически одинаковое значение, но нам нужно правильно выбрать иероглиф, когда он используется в качестве фамилии, особенно в таком формальном контексте, как свадьба. Это зависит от того, какой иероглиф был выбран, когда его/ее предки регистрировали свою фамилию в правительстве в эпоху Мэйдзи (около 1900 года). В любом случае, нам нужна была японская кодировка, пока не был создан Юникод. В те дни японцы в основном использовали кодировку под названием «ShiftJIS», и многие устаревшие системы до сих пор выводят свои файлы в этой кодировке. Что еще хуже, Microsoft Excel в Японии может открыть файл в формате UTF-8 только при наличии BOM. Без BOM его выбор по умолчанию — «ShiftJIS» (и шансов, что файл имеет BOM, меньше…). Если вы откроете файл UTF-8 без BOM японским Excel, он не сможет правильно отобразить символы. Это продолжает вносить путаницу для людей, незнакомых с ИТ, и многие люди все еще думают: «Система должна уметь выводить файл ShiftJIS». Вот почему даже в наши дни японским программистам (таким как я) приходится иметь дело с файлами кодировки «ShiftJIS».

Давайте преобразуем ShiftJIS в UTF-8 с помощью Red

Мотивация

Я часто использую язык программирования Red для обработки данных. Хотя Red — фантастический язык, он молод и не поддерживает простое преобразование кодировок, по крайней мере, сейчас. Конечно, большинство популярных языков могут читать/конвертировать файл ShiftJIS в UTF-8, поэтому я могу справиться с кодировкой с помощью этих языков. Однако для меня полезнее, если я могу конвертировать только с помощью Red, без использования других языков. Поэтому я попытался реализовать код. В этом посте объясняется, как это сделать.

О кодах

Код, который я сделал, находится здесь. Я объясняю, что я сделал и некоторые моменты кода в этом посте.

Первый шаг, создание карты для сопоставления байтов (на C#)

К сожалению, между ShiftJIS и UTF-8 нет логического правила преобразования кодовых точек. Поэтому мне пришлось получить карту байтов, от 1 байта символов Shift-JIS к соответствующим байтам символов UTF-8. Однако в интернете я не смог найти ни одной надежной сравнительной таблицы. Поэтому я написал код на C# для ее создания. Вы можете запустить этот код в приложении LINQPad, очень известном блокноте на C#. Оно бесплатно для базовых функций. Этот код перебирает все возможные значения int от начала кодовой точки ShiftJIS до конца, получает экземпляр char из значения int и затем получает массив байт из char. Вам кажется, что это просто, не так ли? Но есть много «подводных камней» — в ShiftJIS везде есть «неопределенные» кодовые точки! Поэтому мне приходится их пропускать, но нет логического способа определить, является ли определенная точка кодирования «определенной» или нет. Мне приходится жестко кодировать конкретные кодовые точки для пропуска… вот список диапазонов значений, которые мне пришлось пропустить. Их оказалось слишком много, чтобы напечатать😂. shift-jis-utf8-bytes.txt — это результирующий вывод кода. В этом файле пара байтовых выражений находится в каждой строке, разделенных |. Левая часть — это шестнадцатеричное байтовое выражение ShiftJIS, а правая — соответствующее выражение UTF-8. Некоторые из строк приведены ниже в качестве примера.

80|C280
8150|EFBFA3
8151|EFBCBF
8152|E383BD
8153|E383BE
  ・
  ・
  ・
EAA0|E6A787
EAA1|E98199
EAA2|E791A4
EAA3|E5879C
EAA4|E78699
Вход в полноэкранный режим Выход из полноэкранного режима

2-й шаг, создайте значение Red map! в виде таблицы преобразования.

Теперь у меня есть таблица байтов, и я могу обработать ее, чтобы преобразовать в значение Red map!. Это очень просто. Код находится здесь. Шаг прост;

  1. Разделить каждую строку на |
  2. Преобразуйте шестнадцатеричную строку в двоичное значение по dabase/base xxxx 16.

Результирующий файл — bytemap.red.

Последний шаг, разбор и замена двоичного значения для преобразования.

Наконец, я могу написать фактический код для преобразования. shiftjis-to-utf8.red — финальный файл. Код действительно короткий и аккуратный благодаря функции parse в Red.

В строке 11 я включаю файл bytemap.red, который я создал в предыдущем шаге. Затем я создаю блок правил special-bytes, чтобы определить, являются ли двоичные файлы байтами, определенными ShiftJIS, или нет. Если нет, то байты должны находиться внутри диапазона кодов ASCII. ShiftJIS имеет те же кодовые точки до конца кода ASCII, что и UTF-8. Блок Special-bytes выглядит следующим образом;

[
    #{80} | 
    #{8150} | 
    #{8151} | 
    #{8152} | 
    #{8153} | 
    #{8154} |
     ・
     ・
     ・
    #{EAA0} | 
    #{EAA1} | 
    #{EAA2} | 
    #{EAA3} | 
    #{EAA4}]
]
Вход в полноэкранный режим Выход из полноэкранного режима

Эта строка — часть, обрабатывающая байты ShiftJIS. Если текущие байты соответствуют любому из special-bytes, то выполняется код (select bytemap sb) и в результате байты ShiftJIS заменяются на UTF-8. Если байты не совпадают с байтами ShiftJIS, то выполняется эта строка и код (make binary! reduce [ascii]) просто сохраняет байт без изменений, так как это байты ASCII.

В последней строке я добавляю binary! значение #{EFBBF} в начало преобразованного двоичного файла. Это и есть BOM. Поскольку я плохо знаю японский, мне нужно добавить это, чтобы Excel правильно открыл файл…😭.

Как вам код? Он очень понятный!

Мне нравится стиль кода Red. Код двоичной обработки имеет тенденцию быть сложным во многих языках, но в Red я могу написать его как очень декларативный и читабельный код. Если вы заинтересуетесь Red или у вас возникнут вопросы по коду, не стесняйтесь спрашивать!

Оцените статью
devanswers.ru
Добавить комментарий