Pergunta

Eu estou usando arquivos TinyXML para analisar / build XML. Agora, de acordo com a documentação esta biblioteca conjuntos de caracteres de vários bytes suportes através UTF-8. Até aí tudo bem, eu acho. Mas, a única API que a biblioteca oferece (para obter / definir nomes de elementos, nomes de atributos e valores, ... tudo em uma string é usado) é através std::string ou const char*. Isso tem me duvidar de minha própria compreensão do suporte multibyte conjunto de caracteres. Como pode uma cadeia que personagens só suporta 8 bits conter um caractere de 16 bits (a menos que ele usa uma página de código, o que negaria dos suportes Unicode 'claim)? Eu entendo que você poderia, teoricamente, ter um ponto de código de 16 bits e dividi-lo mais de 2 caracteres em um std::string, mas que não iria transformar o std::string a uma string 'Unicode', seria torná-lo inválido para a maioria dos propósitos e seria talvez acidentalmente trabalho quando gravados em um arquivo e ler em por outro programa.

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

(Eu provavelmente misturado alguma terminologia Unicode aqui, desculpe por qualquer confusão vindo daquele).

Foi útil?

Solução

Primeiro, utf-8 é armazenado em const char * cordas, como @quinmars disse. E não é só um super conjunto de 7-bit ASCII (código pontos <= 127 sempre codificado em um único byte como a si mesmos), é, além disso, cuidado para que bytes com esses valores nunca são usados ??como parte da codificação dos valores de vários bytes para pontos de código > = 128. Então, se você ver um byte == 44, é um '<' caractere, etc. Todos os metachars em XML estão em ASCII de 7 bits. Assim, pode apenas analisar o XML, quebrando cordas onde as metachars dizer para, furando os fragmentos (possivelmente incluindo caracteres não-ASCII) em um char * ou std :: string, e os fragmentos devolvidos permanecem válidos UTF-8 cordas, embora o parser não especificamente sabe UTF-8.

Outros (não específicas para XML, mas sim inteligente), ainda mais complexa coisas genrally apenas trabalho (tm). Por exemplo, se você classificar UTF-8 lexicographically por bytes, você recebe a mesma resposta que a triagem lexicographically por pontos de código, apesar da variação # de bytes usados, porque o prefixo bytes introduzir o código mais longo (e, portanto, de maior valor) pontos são numericamente maior do que aqueles para valores menores).

Outras dicas

UTF-8 é compatível com o código ASCII de 7 bits. Se o valor de um byte é maior, em seguida, 127, isso significa que um personagem multibyte começa. Dependendo do valor do primeiro byte você pode ver quantos bytes o personagem vai tomar, que pode ser 2-4 bytes incluindo o primeiro byte (técnico também 5 ou 6 são possíveis, mas eles não são válidos UTF-8). Aqui é um bom recurso sobre UTF-8: UTF-8 e Unicode FAQ , também a página wiki de utf8 é muito informativo. Desde UTF-8 é caractere base 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 ser diferente da contagem de bytes. Funções como strlen () retornar a contagem de bytes, mas não necessariamente a contagem de caracteres.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top