Беда в utf-8 и как её решать

Научно-технические вопросы применения русского языка в программировании. Проекты с сайта программирование-по-русски.рф, кроме ЯОС . Информация об организациях и людях, использующих или изучающих русский язык в программировании. Сравнение операционных систем.
Ответить
БудДен
Сообщения: 2866
Зарегистрирован: 07.10.18 14:01

Беда в 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 используется в редакторах и там какие-то из значений, лежащих за пределами юникода, могут быть уже заняты. Соответственно, надо найти эти значения в ЯОС, если они есть.

Аватара пользователя
Лис [Вежливый]
Сообщения: 563
Зарегистрирован: 08.10.18 13:32

Re: Беда в utf-8 и как её решать

Сообщение Лис [Вежливый] » 07.06.23 03:38

Хороший пост! Мысль про двухстороннее преобразование хорошая, и в этом случае полезная.

В кодировке Unicode есть "зарезервированные страницы", наверное можно использовать их.
https://en.wikipedia.org/wiki/Private_Use_Areas
«They are intentionally left undefined so that third parties may define their own characters without conflicting with Unicode Consortium assignments

Но там можно закопаться:
One of the more well-known and broadly implemented PUA agreements is maintained by the ConScript Unicode Registry (CSUR).
Another common PUA agreement is maintained by the Medieval Unicode Font Initiative (MUFI).

Поэтому надо просто делать свои стандарты, а чужие используемые явно декларировать. "Поддерживаем чистый Unicode и только".

БудДен
Сообщения: 2866
Зарегистрирован: 07.10.18 14:01

Re: Беда в utf-8 и как её решать

Сообщение БудДен » 07.06.23 11:19

О, спасибо, это, наверное, ещё лучше. Наружу у меня в основном торчит utf-8, изредка utf-16, и преобразование - полностью в моих руках. Нестандартные символы не будут покидать пределов ЯОС и тогда неважно, кто и для чего их там использует во внешнем мире, покуда не дойдёт дело до портирования какой-то программы, использующей это.

Ответить