C библиотека для преобразования кодовых точек Unicode в UTF8? - PullRequest
10 голосов
/ 05 января 2011

Мне нужно пройтись по некоторому тексту и написать вывод UTF8 в соответствии с шаблонами символов. Я думал, что будет легко, если я смогу работать с точками кода и преобразовать их в UTF8. Я читал о Unicode и UTF8, но не смог найти хорошее решение. Любая помощь будет оценена.

Ответы [ 4 ]

36 голосов
/ 06 января 2011

Преобразование кодовых точек Unicode в UTF-8 настолько тривиально, что для вызова библиотеки, вероятно, потребуется больше кода, чем просто сделать это самостоятельно:

if (c<0x80) *b++=c;
else if (c<0x800) *b++=192+c/64, *b++=128+c%64;
else if (c-0xd800u<0x800) goto error;
else if (c<0x10000) *b++=224+c/4096, *b++=128+c/64%64, *b++=128+c%64;
else if (c<0x110000) *b++=240+c/262144, *b++=128+c/4096%64, *b++=128+c/64%64, *b++=128+c%64;
else goto error;

Кроме того, выполнение этого самостоятельно означает, что вы можете настроить API-интерфейс для нужного вам типа работы (символьный за раз? Или длинных строк?). Вы можете удалить случаи ошибок, если знаете, что введенный вами код является допустимым Unicode. скалярное значение.

Другое направление сложнее понять. Я рекомендую подход с конечным автоматом, а не типичные битовые арифметические циклы, которые иногда декодируют недопустимые последовательности как псевдонимы для реальных символов (что очень опасно и может привести к проблемам с безопасностью).

Редактировать: Даже если вы в конечном итоге пойдете с библиотекой, я думаю, вам следует либо сначала попробовать написать ее самостоятельно, либо, по крайней мере, серьезно изучить спецификацию UTF-8, прежде чем идти дальше. Много плохого дизайна может возникнуть из-за того, что UTF-8 рассматривается как черный ящик, когда весь смысл в том, что он не черный, а создан с очень мощными свойствами, и слишком многие программисты, не знакомые с UTF-8, не видят этого до они сами много с этим работали.

5 голосов
/ 05 января 2011

iconv можно использовать, я думаю.

#include <iconv.h>

iconv_t cd;
char out[7];
wchar_t in = CODE_POINT_VALUE;
size_t inlen = sizeof(in), outlen = sizeof(out);

cd = iconv_open("utf-8", "wchar_t");
iconv(cd, (char **)&in, &inl, &out, &outlen);
iconv_close(cd);

Но я боюсь, что wchar_t может представлять не кодовые точки Юникода, а произвольные значения. РЕДАКТИРОВАТЬ: Я думаю, вы можете сделать это, просто используя источник Unicode:

uint16_t in = UNICODE_POINT_VALUE;
cd = iconv_open("utf-8", "ucs-2");
2 голосов
/ 05 января 2011
1 голос
/ 05 января 2011

Какая платформа? В Windows вы можете использовать WideCharToMultiByte (CP_UTF8, ...)

Возможно, исходная кодовая точка должна быть закодирована в UTF-16, что означает, что вы должны быть в состоянии сделать такое кодирование. В некоторых случаях (суррогатные пары) это не тривиально.

Насколько я понимаю, у вас есть какой-то текст в заданной кодовой странице, и вы хотите преобразовать его в Unicode (UTF-16). Правильно? MultiByteToWideChar (codePage, sourceText, ...) / WideCharToMultiByte (CP_UTF8, utf16Text, ...) совершит прием.

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