/ / Como funciona o suporte utf-8 do TinyXML? - c ++, unicode, utf-8, tinyxml

Como funciona o suporte utf-8 do TinyXML? - c ++, unicode, utf-8, tinyxml

Estou a usar TinyXML para analisar / construir arquivos XML. Agora, de acordo com a documentação esta biblioteca suporta conjuntos de caracteres multibyteatravés do utf-8. Até aí tudo bem, eu acho. Mas, a única API que a biblioteca fornece (para obter / configurar nomes de elementos, nomes e valores de atributos, ... tudo em que uma string é usada) é através de std::string ou const char*. Isso me faz duvidar da minha própria compreensãosuporte a conjunto de caracteres multibyte. Como uma string que suporta apenas caracteres de 8 bits contém um caractere de 16 bits (a menos que ela use uma página de código, o que negaria a declaração "suporta Unicode")? Eu entendo que você poderia, teoricamente, pegar um código de 16 bits e dividi-lo em 2 caracteres em um std::string, mas isso não iria transformar o std::string para uma seqüência de caracteres "Unicode", seria inválida para a maioria dos propósitos e talvez funcionasse acidentalmente quando gravada em um arquivo e lida por outro programa.

Então, alguém pode me explicar como uma biblioteca pode oferecer uma "interface de 8 bits" (std::string ou const char*) e ainda suporta strings "Unicode"?

(Eu provavelmente confundi alguma terminologia Unicode aqui; desculpe por qualquer confusão que venha disso).

Respostas:

8 para resposta № 1

Primeiro, utf-8 é armazenado em strings const char *,como @quinmars disse. E não é apenas um superconjunto de ASCII de 7 bits (pontos de código <= 127 sempre codificados em um único byte como eles mesmos), além disso, é cuidadoso que os bytes com esses valores nunca sejam usados ​​como parte da codificação do multibyte. valores para pontos de código> = 128. Portanto, se você vir um byte == 44, ele é um caractere "<", etc. Todos os metachars em XML estão em ASCII de 7 bits. Portanto, é possível apenas analisar o XML, quebrando strings onde os metachars dizem, colocando os fragmentos (possivelmente incluindo caracteres não-ASCII) em um char * ou std :: string, e os fragmentos retornados permanecem válidos utf-8 strings mesmo que o analisador não saiba especificamente utf-8 .

Além disso (não é específico para XML, mas sim inteligente),coisas ainda mais complexas funcionam apenas genralmente (tm). Por exemplo, se você classifica utf-8 lexicograficamente por bytes, obtém a mesma resposta que classificá-la lexicograficamente por pontos de código, apesar da variação em # de bytes usados, porque o prefixo bytes introduz o código mais longo (e portanto com maior valor) pontos são numericamente maiores do que aqueles para valores menores).


2 para resposta № 2

utf-8 é compatível com o código ASCII de 7 bits. Se o valor de um byte for maior que 127, isso significa que um caractere multibyte é iniciado. Dependendo do valor do primeiro byte, você pode ver quantos bytes o caractere terá, que podem ser de 2 a 4 bytes incluindo o primeiro byte (técnicos também 5 ou 6 são possíveis, mas não são válidos para o utf-8). Aqui está um bom recurso sobre o utf-8: Perguntas frequentes sobre utf-8 e Unicode, também a página wiki do utf8 é muito informativa. Como o utf-8 é baseado em char e 0-terminado, você pode usar as funções de string padrão para a maioria das coisas. A única coisa importante é que a contagem de caracteres pode diferir da contagem de bytes. Funções como strlen () retornam a contagem de bytes, mas não necessariamente a contagem de caracteres.


0 para resposta № 3

Usando entre 1 e 4 caracteres para codificar um ponto de código Unicode.