Логика преобразования символа в UTF-8

У меня есть следующий фрагмент кода, который в комментарии в коде говорит, что он преобразует любой символ больше, чем 7F до UTF-8. У меня есть следующие вопросы по этому коду:

if((const unsigned char)c > 0x7F)
{
Buffer[0] = 0xC0 | ((unsigned char)c >> 6);
Buffer[1] = 0x80 | ((unsigned char)c & 0x3F);
return Buffer;
}
  1. Как работает этот код?
  2. Имеет ли текущая кодовая страница Windows, которую я использую, какое-либо влияние на символ, помещенный в Buffer?

0

Решение

Для начала, код не работает, в общем. От
совпадение, это работает если кодировка в char (или же unsigned
char
) является ISO-8859-1, потому что ISO-8859-1 имеет тот же код
указывает в качестве первых 256 кодовых точек Unicode. Но ISO-8859-1 имеет
в значительной степени был заменен ISO-8859-15, так что, вероятно, не будет
Работа. (Попробуйте для 0xA4, например. Вход в евро
ISO-8859-15. Это даст вам совершенно другой
персонаж.)

Есть два правильных способа сделать это преобразование, оба из которых
зависит от знания кодировки вводимого байта (который
означает, что вам может понадобиться несколько версий кода, в зависимости от
на кодировку). Самое простое — это просто иметь массив с
256 строк, по одной на символ, и индекс в это. В котором
случай, вам не нужно if, Другой переводить
код в кодовую точку Unicode (32-битный UTF-32), и преобразовать
это в UTF-8 (который может потребовать более двух байтов для некоторых
символы: символ евро 0x20AC: 0xE2, 0x82, 0xAC).

РЕДАКТИРОВАТЬ:

Для хорошего знакомства с UTF-8:
http://www.cl.cam.ac.uk/~mgk25/unicode.html. Название говорит это
для Unix / Linux, но там очень мало, если таковые имеются, системы
конкретная информация в нем (и такая информация явно
маркированный).

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]