Domanda

Sto usando TinyXML per analizzare / creare file XML. Ora, secondo la documentazione questa libreria supporta set di caratteri multibyte tramite UTF-8. Fin qui tutto bene penso. Tuttavia, l'unica API fornita dalla libreria (per ottenere / impostare nomi di elementi, nomi di attributi e valori, ... tutto ciò in cui viene utilizzata una stringa) è attraverso std::string o const char*. Questo mi fa dubitare della mia comprensione del supporto del set di caratteri multibyte. Come può una stringa che supporta solo caratteri a 8 bit contenere un carattere a 16 bit (a meno che non utilizzi una tabella codici, che negherebbe l'affermazione "supporta Unicode")? Capisco che in teoria potresti prendere un punto di codice a 16 bit e dividerlo su 2 caratteri in un <=>, ma ciò non trasformerebbe <=> in una stringa 'Unicode', lo renderebbe non valido per la maggior parte degli scopi e potrebbe funzionare accidentalmente quando viene scritto su un file e letto da un altro programma.

Quindi, qualcuno può spiegarmi come una libreria può offrire un'interfaccia a 8 bit (<=> o <=>) e supportare comunque le stringhe "Unicode"?

(Probabilmente ho confuso un po 'di terminologia Unicode qui; mi dispiace per qualsiasi confusione derivante da ciò).

È stato utile?

Soluzione

Innanzitutto, utf-8 è memorizzato in stringhe const char *, come ha detto @quinmars. E non è solo un superset di ASCII a 7 bit (code points & Lt; = 127 sempre codificato in un singolo byte come essi stessi), è inoltre attento che i byte con tali valori non vengano mai utilizzati come parte della codifica del multibyte valori per i punti di codice > = 128. Quindi, se vedi un byte == 44, è un '<' carattere, ecc. Tutti i metachar in XML sono in ASCII a 7 bit. Quindi si può semplicemente analizzare l'XML, rompendo le stringhe dove dicono i metacar, attaccando i frammenti (possibilmente includendo caratteri non ASCII) in un carattere * o std :: stringa, e i frammenti restituiti rimangono stringhe UTF-8 valide anche se il il parser non conosceva specificamente UTF-8.

Inoltre (non specifico per XML, ma piuttosto intelligente), le cose ancora più complesse funzionano in genere (tm). Ad esempio, se si ordina UTF-8 lessicograficamente per byte, si ottiene la stessa risposta ordinandola lessicograficamente per punti di codice, nonostante la variazione del numero di byte utilizzati, poiché i prefissi byte introducono il codice più lungo (e quindi più apprezzato) i punti sono numericamente maggiori di quelli per valori inferiori).

Altri suggerimenti

UTF-8 è compatibile con il codice ASCII a 7 bit. Se il valore di un byte è maggiore di 127, significa che inizia un carattere multibyte. A seconda del valore del primo byte puoi vedere quanti byte prenderà il carattere, che possono essere 2-4 byte incluso il primo byte (sono possibili anche 5 o 6 tecnici, ma non sono validi utf-8). Ecco una buona risorsa su UTF-8: UTF-8 e FAQ Unicode , anche la pagina wiki di utf8 è molto istruttiva. Poiché UTF-8 è basato sul carattere e con terminazione 0, è possibile utilizzare le funzioni stringa standard per la maggior parte delle cose. L'unica cosa importante è che il conteggio dei caratteri può differire dal conteggio dei byte. Funzioni come strlen () restituiscono il conteggio dei byte ma non necessariamente il conteggio dei caratteri.

Usando tra 1 e 4 caratteri per codificare un punto di codice Unicode.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top