Я использую TinyXML для анализирования/создавания XML-файлов. Теперь, согласно документации эта библиотека поддерживает многобайтовые наборы символов через UTF-8. Пока неплохо я думаю. Но, единственный API, который обеспечивает библиотека (для получения/установки имен элементов, названий атрибута и значений... все, где строка используется) через std::string
или const char*
. Это имеет меня сомневающийся относительно моего собственного понимания поддержки многобайтового набора символов. Как может строка, которая только поддерживает 8-разрядные символы, содержат символ на 16 битов (если это не использует кодовую страницу, которая инвертировала бы 'требование' Unicode поддержек)? Я понимаю, что Вы могли теоретически взять точку 16-битного кода и разделить ее более чем 2 символа в a std::string
, но это не преобразовало бы std::string
к строке 'Unicode' это сделало бы это недопустимым в большинстве целей и будет, возможно, случайно работать при записи в файл и чтение в другой программой.
Так, может кто-то объяснять мне, как библиотека может предложить '8-разрядный интерфейс' (std::string
или const char*
) и все еще поддерживайте строки 'Unicode'?
(Я, вероятно, перепутал некоторую терминологию Unicode здесь; извините о любом беспорядке, прибывающем из этого).
Во-первых, utf-8 хранится в символе константы * строки, как сказал @quinmars. И это не только надмножество 7-разрядного ASCII (кодовые точки <= 127 всегда кодируемый в единственном байте как сами), это, кроме того, осторожно, что байты с теми значениями никогда не используются в качестве части кодирования многобайтовых значений для кодовых точек> = 128. Таким образом, если Вы видите байт == 44, это' <' символ и т.д. Все метасимволы в XML находятся в 7-разрядном ASCII. Таким образом, можно просто проанализировать XML, повредив строки, где метасимволы говорят, засовывая фрагменты (возможно включая символы неASCII) в символ * или станд.:: строка и возвращенные фрагменты остаются допустимыми строками UTF-8 даже при том, что синтаксический анализатор конкретно не знал UTF-8.
Далее (не характерный для XML, а скорее умный), еще более сложные вещи genrally просто работают (TM). Например, при сортировке UTF-8 лексикографически по байтам Вы получаете тот же ответ как сортировка его лексикографически кодовыми точками, несмотря на вариацию в # используемых байтов, потому что байты префикса, представляющие дольше (и следовательно с более высоким знаком), кодовые точки численно больше, чем кодовые точки для меньших значений).
UTF-8 совместим с 7-разрядным кодом ASCII. Если значение байта больше затем 127, это означает, что многобайтовый символ запускается. В зависимости от значения первого байта Вы видите, сколько байтов символ возьмет, который может составить 2-4 байта включая первый байт (технический также 5, или 6 возможны, но они не допустимый utf-8). Вот хороший ресурс о UTF-8: UTF-8 и Unicode FAQ, также страница Wiki для utf8 очень информативна. Так как UTF-8 является символом, базирующимся и 0 завершенным, можно использовать стандартные строковые функции для большинства вещей. Единственная важная вещь состоит в том, что счетчик символов может отличаться от количества байта. Функции как strlen () возвращают количество байта, но не обязательно счетчик символов.
При помощи между 1 и 4 символами для кодирования одной кодовой точки Unicode.