Comment “décoder” un caractère UTF-8?

Supposons que je veuille écrire une fonction pour comparer deux caractères Unicode. Comment devrais-je faire ça? J’ai lu des articles (comme celui-ci ) mais je ne l’ai toujours pas compris. Prenons comme entrée. Il est dans la plage 0x0800 et 0xFFFF , il utilisera donc 3 octets pour le coder. Comment puis-je le décoder? opération au niveau du bit pour obtenir 3 octets à partir de wchar_t et stocker dans 3 caractères? Un code dans l’exemple en C pourrait être génial.

Voici mon code C pour “décoder” mais montre évidemment une mauvaise valeur pour décoder unicode

 #include  #include  void printbin(unsigned n); int length(wchar_t c); void print(struct Bytes *b); // support for UTF8 which encodes up to 4 bytes only struct Bytes { char v1; char v2; char v3; char v4; }; int main(void) { struct Bytes bytes = { 0 }; wchar_t c = '€'; int len = length(c); //c = 11100010 10000010 10101100 bytes.v1 = (c >> 24) <> 16) <> 8) <v1); int v2 = (int)(b->v2); int v3 = (int)(b->v3); int v4 = (int)(b->v4); printf("v1 = %d\n", v1); printf("v2 = %d\n", v2); printf("v3 = %d\n", v3); printf("v4 = %d\n", v4); } int length(wchar_t c) { if (c >= 0 && c = 0x0080 && c = 0x0800 && c = 0x10000 && c = 0x200000 && c = 0x4000000 && c > 1); printf("%c", (n & 1) ? '1' : '0'); } 

Ce n’est pas du tout facile de comparer des caractères encodés en UTF-8. Mieux vaut ne pas essayer. Non plus:

  1. Convertissez-les tous les deux en un format large (entier de 32 bits) et comparez-les de manière arithmétique. Voir wssortingng_convert ou votre fonction spécifique au vendeur préférée; ou

  2. Convertissez-les en 1 chaînes de caractères et utilisez une fonction qui compare les chaînes codées en UTF-8. Il n’y a pas de moyen standard de faire cela en C ++, mais c’est la méthode préférée dans d’autres langages tels que Ruby, PHP, peu importe.


Soyons clairs: ce qui est difficile, c’est de prendre des bits / octets / caractères bruts codés au format UTF_8 et de les comparer. En effet, votre comparaison doit prendre en compte le codage pour savoir s’il faut comparer 8 bits, 16 bits ou plus. Si vous pouvez d’une manière ou d’une autre transformer les bits de données brutes en une chaîne à terminaison null, la comparaison est sortingvialement facile en utilisant des fonctions de chaîne normales. Cette chaîne peut avoir plus d’un octet / octet de longueur, mais elle représentera un seul caractère / sharepoint code.


Windows est un cas particulier. Les caractères larges sont short int (16 bits). Historiquement, cela s’appelait UCS-2 mais il a été redéfini comme UTF-16. Cela signifie que tous les caractères valides du plan multilingue de base (BMP) peuvent être comparés directement, car ils occuperont un seul court int, mais pas d’autres. Je ne suis au courant d’aucun moyen simple de traiter les caractères de 32 bits (représentés par un simple int) en dehors du BMP sous Windows.