Пилю тихонько веб-сервис на kore.io и сейчас стал нужен шаблонизатор пока что пишу его прототип ясен пень что он тоже на Си. База будет в utf-8, кодировка html выхлопа тоже utf-8,пользовательские данные через POST тоже могут быть utf-8, пока пишу прототип не парюсь и всё обрабатывается просто как char*. Но так как никогда вплотную не работал с utf-8 боюсь граблей от переменной длинны символов. Если есть что по теме посоветовать, буду рад почитать.
Ну и по традиции cast сишников DELIRIUM, i-rinat,
beastie,
ncrmnt,
Iron_Bug.
UDP: Довольно забавное чтиво, отражающее «всю» красоту работы с utf-8 :D https://gist.github.com/outpunk/1956399
UDP2: я ненавижу unicode
UDP3:
не так страшен чёрт как его малюют utf8+char=❤
UDP4: Агрегирую всё нижесказанное и дополнительные ссылки которые могут быть полезны залётным падаванам ::)
Что-бы понять как оно в памяти лежит.
- Перво наперво => wikipediaUTF-8
wchar_t - если хотите любой символ хранить и юзаете только системы где он 32 бита то пожалуйста, но помните даже utf-8 текст очень часто на 90% состоит из набора ASCII который занимает 1 байт и просто так увеличивать размер текста в четверо заимея лишь возможность безболезненно прыгать по нормализованным символам, ну не знаю, вам решать, можно но не нужно.
- Код от
a1batrossза авторствомmittorn полезно для понимания как сдвинуть символ, как перевести в другую кодировку и прочее
- libutf Предложенный
beastie предоставляет функции для насущных нужд
typedef int32_t Rune; Rune *runestrcat(Rune *, const Rune *); Rune *runestrncat(Rune *, const Rune *, size_t); int runestrcmp(const Rune *, const Rune *); int runestrncmp(const Rune *, const Rune *, size_t); Rune *runestrcpy(Rune *, const Rune *); Rune *runestrncpy(Rune *, const Rune *, size_t); size_t runestrlen(const Rune *); Rune *runestrchr(const Rune *, Rune); Rune *runestrrchr(const Rune *, Rune); Rune *runestrdup(const Rune *); Rune *runestrstr(const Rune *, const Rune *); //и прочие не менее полезные
- utf8proc от проекта языка julia написана на С и создана для жизненно необходимой нормализации utf-8.
** NFD normalization (@ref UTF8PROC_DECOMPOSE). */ UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFD(const utf8proc_uint8_t *str); /** NFC normalization (@ref UTF8PROC_COMPOSE). */ UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFC(const utf8proc_uint8_t *str); /** NFKD normalization (@ref UTF8PROC_DECOMPOSE and @ref UTF8PROC_COMPAT). */ UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKD(const utf8proc_uint8_t *str); /** NFKC normalization (@ref UTF8PROC_COMPOSE and @ref UTF8PROC_COMPAT). */ UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKC(const utf8proc_uint8_t *str);
- iconv или ICU перекодировка и манипуляция с unicode и другими кодировками
- glib utf-8/16, содержит практически всё что нужно
-
i-rinalдал очень полезную штуку в которой описаны псевдонимы кодировок, кодировка одна а названий её десяток =) -
waker предложил свою библиотеку для манимуляций с utf-8, стоит отметить разнообразие функций и скорость.
- Анон пнул в матчасть =) отдельное спасибо
-
mittorn поделился ссылочкой декодера и ещё одного
Ну и вроде как всё, на последок просто ссылок
https://habrahabr.ru/post/45489/ https://habrahabr.ru/post/311518/ https://ru.wikipedia.org/wiki/UTF-16 http://unicodebook.readthedocs.io/programming_languages.html http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm https://ru.wikipedia.org/wiki/Широкий_символ http://www.cl.cam.ac.uk/~mgk25/unicode.html#c https://habrahabr.ru/post/138173/