Как преобразовать многобайтовое символьное представление UTF-8 в один байт, сохранив (не) буквенно-цифровое свойство? - PullRequest
0 голосов
/ 11 марта 2011

У меня есть строка UTF-8 как char*.Чтобы получить свойство один байт на символ (и, таким образом, иметь произвольный доступ к строке с помощью символьных индексов), я в настоящее время просто удаляю из него все байты продолжения UTF-8 (я хотел бы избежать "правильного"преобразование в статическое представление ширины байта).

Вместо удаления всех байтов продолжения я хотел бы иметь возможность проверить, является ли данный многобайтовый символ UTF-8 буквенно-цифровым (или нет), а затем заменить его насоответствующий символ ASCII (скажем, a для буквенно-цифровых символов и . в противном случае).Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

Для каждого байта в строке:

  • Если это байт ASCII, просто скопируйте его.
  • Если это главный байт UTF-8, декодируйте, начиная с этого байта, до wchar_t, используя mbrtowc, определите символ ASCII, классификация которого соответствует, сравнивая результаты функций isw*(), и скопируйте этот символ ASCII на выход.
  • Если это что-то еще, пропустите это.
2 голосов
/ 11 марта 2011

В общем случае сделать это невозможно, поскольку буквы за пределами диапазона ASCII (например, α) также могут быть акцентированы (ἄ). Но вы можете применить нормализацию Unicode *1001* для разложения акцентированных кодовых точек на их составляющие, а затем проверить, находятся ли компоненты в пределах диапазона ASCII. ICU имеет поддержку нормализации .

0 голосов
/ 12 марта 2011

Unicode получил 1114111 (0x10FFFF) в качестве наивысших кодовых точек, что означает почти миллион символов.Один байт может представлять 256 символов.

Так просто ответ, что вы не можете сделать это таким образом.

Насколько я понимаю из вопроса, вы хотите это для произвольного доступа к символам в строке.Вы используете 32-битные символы.(Поправьте меня, если я не прав).

Вместо того, чтобы обработать его, написав свой код, используйте ICU и с помощью конвертера конвертируйте его в UTF-32 (4 байта)персонаж). ucnv_convertEx - функция, которая будет использоваться для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...