Декодирование байтов в D
У меня есть какой-то неправильно декодированный фрагмент текста. Он был декодирован как cp866, но на самом деле это должен быть utf-8 ("нажал кабан на баклажан"
-> "╨╜╨░╨╢╨░╨╗ ╨║╨░╨▒╨░╨╜ ╨╜╨░ ╨▒╨░╨║╨╗╨░╨╢╨░╨╜"
). Я хотел бы это исправить, и я уже написал код на Python, который решает задачу:
broken = "╨╜╨░╨╢╨░╨╗ ╨║╨░╨▒╨░╨╜ ╨╜╨░ ╨▒╨░╨║╨╗╨░╨╢╨░╨╜"
fixed = bytes(broken, 'cp866').decode('utf-8')
print(fixed) # it will print 'нажал кабан на баклажан'
Однако сначала я пытался решить эту проблему в D, но не смог найти ответ. Итак, как решить эту задачу в D?
1 ответ
Решение
На данный момент D не имеет обширных встроенных средств для преобразования текста между кодировками.
Вот несколько вариантов:
- Как упоминал фантик, у D действительно есть std.encoding, но на данный момент он не охватывает много кодировок.
- В Windows вы можете использовать
std.windows.charset.fromMBSz
а такжеtoMBSz
какую оберткуMultiByteToWideChar
а такжеWideCharToMultiByte
, - Вы можете просто встроить кодировки, которые вас интересуют, в вашу программу ( пример).
- В POSIX вы можете вызвать
iconv
программа ( пример), или используйтеlibiconv
библиотека ( связывание D1).