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