Как делает поддержку UTF-8 работы TinyXML?

Я использую 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 здесь; извините о любом беспорядке, прибывающем из этого).

12
задан TRiG 28 May 2013 в 09:49
поделиться

3 ответа

Во-первых, utf-8 хранится в символе константы * строки, как сказал @quinmars. И это не только надмножество 7-разрядного ASCII (кодовые точки <= 127 всегда кодируемый в единственном байте как сами), это, кроме того, осторожно, что байты с теми значениями никогда не используются в качестве части кодирования многобайтовых значений для кодовых точек> = 128. Таким образом, если Вы видите байт == 44, это' <' символ и т.д. Все метасимволы в XML находятся в 7-разрядном ASCII. Таким образом, можно просто проанализировать XML, повредив строки, где метасимволы говорят, засовывая фрагменты (возможно включая символы неASCII) в символ * или станд.:: строка и возвращенные фрагменты остаются допустимыми строками UTF-8 даже при том, что синтаксический анализатор конкретно не знал UTF-8.

Далее (не характерный для XML, а скорее умный), еще более сложные вещи genrally просто работают (TM). Например, при сортировке UTF-8 лексикографически по байтам Вы получаете тот же ответ как сортировка его лексикографически кодовыми точками, несмотря на вариацию в # используемых байтов, потому что байты префикса, представляющие дольше (и следовательно с более высоким знаком), кодовые точки численно больше, чем кодовые точки для меньших значений).

8
ответ дан 2 December 2019 в 22:24
поделиться

UTF-8 совместим с 7-разрядным кодом ASCII. Если значение байта больше затем 127, это означает, что многобайтовый символ запускается. В зависимости от значения первого байта Вы видите, сколько байтов символ возьмет, который может составить 2-4 байта включая первый байт (технический также 5, или 6 возможны, но они не допустимый utf-8). Вот хороший ресурс о UTF-8: UTF-8 и Unicode FAQ, также страница Wiki для utf8 очень информативна. Так как UTF-8 является символом, базирующимся и 0 завершенным, можно использовать стандартные строковые функции для большинства вещей. Единственная важная вещь состоит в том, что счетчик символов может отличаться от количества байта. Функции как strlen () возвращают количество байта, но не обязательно счетчик символов.

2
ответ дан 2 December 2019 в 22:24
поделиться

При помощи между 1 и 4 символами для кодирования одной кодовой точки Unicode.

0
ответ дан 2 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: