Беда в utf-8 и как её решать
Добавлено: 06.06.23 23:38
Думаю, многие сталкивались с падением программы, которая на вход ожидает utf-8, но приходит что-то иное. Это плохо. Предлагается способ превращения из UTF-8 в UCS-4, который передаёт информацию о тексте без потерь и не падает. Делается так:
начинаем читать входную строку байт. Пока она utf-8, преобразуем utf-8 в UTF-32 и кладём в выходную строку из симв32 (слов 32-битных).
Как только встречается неверная последовательность из N байт, превращаем каждый из этих байт в значение UCS-4 (32-битное слово), равное
Здесь БазаНеверныхБайт - это некое значение за пределами UTF-32, например, равное 0x200000 (весь юникод имеет коды не более 0x10FFFF).
Переход обратно к кодировке UTF-8 происходит при восстановлении utf-8.
При этом количество символов UCS-4 для кодировки любой строки байт не превосходит количества байт. Остаются вопросы:
* на сколько байт вперёд надо смотреть
* какого размера буфер нужен для раскодировки
* более точный выбор базы неверных байт
* в т.ч. в ЯОС. В википедии написано, что UCS-4 используется в редакторах и там какие-то из значений, лежащих за пределами юникода, могут быть уже заняты. Соответственно, надо найти эти значения в ЯОС, если они есть.
начинаем читать входную строку байт. Пока она utf-8, преобразуем utf-8 в UTF-32 и кладём в выходную строку из симв32 (слов 32-битных).
Как только встречается неверная последовательность из N байт, превращаем каждый из этих байт в значение UCS-4 (32-битное слово), равное
Код: Выделить всё
БазаНеверныхБайт + значениеБайтаКакБеззнаковоеЦелоеПереход обратно к кодировке UTF-8 происходит при восстановлении utf-8.
При этом количество символов UCS-4 для кодировки любой строки байт не превосходит количества байт. Остаются вопросы:
* на сколько байт вперёд надо смотреть
* какого размера буфер нужен для раскодировки
* более точный выбор базы неверных байт
* в т.ч. в ЯОС. В википедии написано, что UCS-4 используется в редакторах и там какие-то из значений, лежащих за пределами юникода, могут быть уже заняты. Соответственно, надо найти эти значения в ЯОС, если они есть.