Pull to refresh

Comments 7

Т.е. костыль, чтобы поддерживать русский в UTF-8?
Я плохо себе представляю как выглядит UTF-8 в бинарном виде, но не лучше ли прикрутить что-то типа (http://utfcpp.sourceforge.net/) и с ее помощью считать сколько выдавлено utf-8 codepoints в аутпут?
Ваш хак, если не ошибаюсь, развалится даже от символа «евро» попадись он в нужном месте.

Добавлю: codepoint в utf-8 всегда начинается с байта с двумя старшими единицами, а продолжается — несколькими байтами с одной старшей единицей и потом нулем.


Так что проверку надо было писать вот так:


if (SECU_GetWrapEnabled() && column > 76 && (val <= 0x7F || val => 0xC0)) {

Или вот так (эквивалентно):


if (SECU_GetWrapEnabled() && column > 76 && (val & 0xC0) != 0x80)) {

Но еще правильнее — увеличивать column только после окончания codepoint, а не после каждого байта (но для иероглифов вроде бы увеличивать надо не на 1, а не 2). Тут так просто код я уже не напишу.

И так евро в UTF-8 кодируется тремя байтами (это ,tp признака UTF-8 — 0xEF0xBB0xBF ) — 0xE20x820xAC. И как он развалит что-либо? Никак. Все три символа не попадают в условие

(val <= 0x7F || val == 0xD0 || val == 0xD1)

и символ евро будет обработан корректно. С другой стороны, я рассчитывал на такой вопрос, что код не универсален. И просто думал что кто-то добавит универсальное решение. Если проблема известна, то и решение всегда будет найдено.
Пользуясь случаем, кто-нибудь знает готовую embedded библиотеку для NSS? Нам в приложении необходимо устанавливать сертификаты и хотелось бы использовать какие-нибудь вызовы API NSS не через командную строку.
Sign up to leave a comment.

Articles

Change theme settings