Декодирование байтов в 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).
Другие вопросы по тегам