Кодировка utf-8 - это кодировка переменной ширины Юникода. Каждая кодовая точка Юникода может быть закодирована от одного до четырех char
.
Чтобы декодировать строку char*
и извлечь одну кодовую точку, вы читаете один байт. Если установлен самый старший бит, кодовая точка кодируется из нескольких символов, в противном случае это кодовая точка Unicode. Количество установленных битов, считая от старшего значащего бита, указывает, сколько char
используется для кодирования кодовой точки Unicode.
Эта таблица объясняет, как сделать преобразование:
UTF-8 (char*) | Unicode (21 bits)
------------------------------------+--------------------------
0xxxxxxx | 00000000000000000xxxxxxx
------------------------------------+--------------------------
110yyyyy 10xxxxxx | 0000000000000yyyyyxxxxxx
------------------------------------+--------------------------
1110zzzz 10yyyyyy 10xxxxxx | 00000000zzzzyyyyyyxxxxxx
------------------------------------+--------------------------
11110www 10zzzzzz 10yyyyyy 10xxxxxx | 000wwwzzzzzzyyyyyyxxxxxx
Исходя из этого, код относительно прост для написания. Если вы не хотите писать это, вы можете использовать библиотеку, которая выполняет преобразование для вас. В Linux доступно много: libiconv , icu , glib , ...