Подтвердить что ты не робот

Как работает UTF-8 TinyXML?

Я использую TinyXML для разбора/сборки XML файлов. Теперь, согласно документации, эта библиотека поддерживает многобайтовые наборы символов через UTF-8. До сих пор так хорошо, что я думаю. Но единственный API, который предоставляет библиотека (для получения/установки имен элементов, имен атрибутов и значений,... всего, где используется строка) через std::string или const char*. Это заставляет меня сомневаться в моем понимании многобайтовой поддержки набора символов. Как строка, поддерживающая только 8-битные символы, содержит 16-битный символ (если только он не использует кодовую страницу, что бы отрицать утверждение "поддерживает Unicode" )? Я понимаю, что теоретически можно взять 16-битную кодовую точку и разделить ее на 2 символа в std::string, но это не превратило бы строку std::string в строку "Unicode", это сделало бы ее недопустимой для большинства целей и, возможно, случайно будет работать при записи в файл и прочитать другую программу.

Итак, может кто-нибудь объяснить мне, как библиотека может предложить "8-битный интерфейс" (std::string или const char*) и все еще поддерживает строки "Unicode"?

(Я, вероятно, перепутал терминологию Юникода здесь, извините за любую путаницу, исходящую от этого).

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Используя 1 и 4 символа для кодирования одной кодовой точки Юникода.