У меня есть следующий фрагмент кода, который в комментарии в коде говорит, что он преобразует любой символ больше, чем 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;
}
Buffer
?Для начала, код не работает, в общем. От
совпадение, это работает если кодировка в char
(или же unsigned
) является ISO-8859-1, потому что ISO-8859-1 имеет тот же код
char
указывает в качестве первых 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, но там очень мало, если таковые имеются, системы
конкретная информация в нем (и такая информация явно
маркированный).
Других решений пока нет …