Conversion de caractères UTF-8 en majuscules / minuscules C ++

J’ai une chaîne qui contient des caractères UTF-8, et j’ai une méthode qui est supposée convertir chaque caractère en majuscule ou en minuscule, ceci se fait facilement avec des caractères qui se chevauchent avec ASCII, et évidemment certains caractères ne peuvent pas être convertis, par exemple n’importe quel caractère chinois. Cependant, existe-t-il un bon moyen de détecter et de convertir d’autres caractères pouvant être Upper / Lower, par exemple tous les caractères grecs? Notez également que je dois pouvoir le faire sous Windows et Linux.

Je vous remercie,

Jetez un oeil à l’ ICU .

Notez que les minuscules et les majuscules dépendent des parameters régionaux. Pensez à la lettre turque (ascii) I qui obtient “i minuscule sans point” et (ascii) i qui obtient “I majuscule avec un point”.

En supposant que vous ayez access à wctype.h, convertissez votre texte en une chaîne unicode de 2 octets et utilisez towupper (). Puis reconvertissez-le en UTF-8.

Sous Linux, ou avec une bibliothèque standard qui le prend en charge, vous obtiendrez un object std::locale pour les parameters régionaux appropriés, car la conversion des majuscules est spécifique aux parameters régionaux. Convertissez chaque caractère UTF-8 en wchar_t , puis appelez std::toupper() , puis reconvertissez-le en UTF-8. Notez que la chaîne résultante peut être plus longue ou plus courte et que certaines ligatures risquent de ne pas fonctionner correctement: ß à Ss en allemand est l’exemple que tout le monde continue à proposer.

Sous Windows, cette approche fonctionnera encore moins, car les caractères larges sont UTF-16 et non un encodage à largeur fixe (ce qui viole la norme du langage C ++, mais le comité des normes n’aurait peut-être pas dû bluffer Microsoft). briser l’API Windows). Il existe une méthode ToUpper dans le CLR.

Il est probablement plus facile d’utiliser une bibliothèque portable telle que l’ICU.

Assurez-vous également que ce que vous voulez est en majuscule (en majuscule chaque lettre) ou titlecase (en majuscule la première lettre d’une chaîne, ou la première partie d’une ligature).

Unicode spécifie la structure générale de:

Aucun encodage ne peut prendre en charge tous les processus de texte de base. Par conséquent, certains compromis sont nécessaires. Par exemple, suivant la pratique courante, Unicode définit des codes distincts pour les lettres majuscules et minuscules. Ce choix entraîne l’exécution plus facile de certains processus de texte, tels que le rendu, mais d’autres processus, tels que la comparaison, deviennent plus difficiles. Un design d’encodage différent pour l’anglais, tel que les codes de contrôle de la casse, aurait l’effet inverse. Lors de la conception d’un nouveau schéma de codage pour les scripts complexes, ces compromis doivent être évalués et les décisions sockets explicitement.

suivi dans un paragraphe ultérieur:

La définition du comportement de mise en page par défaut d’Unicode n’a pas pour but de mettre en place une disposition esthétique unique et spécifique pour chaque script, mais plutôt d’encourager l’uniformité du codage.

suivi par:

En particulier, les algorithmes de sorting et de comparaison de chaînes ne peuvent pas supposer que l’atsortingbution des numéros de code de caractères Unicode fournit un classement alphabétique pour la comparaison de chaînes lexicographiques.

et suivi dans la section d’ordre logique:

L’ordre dans lequel le texte Unicode est stocké dans la représentation de la mémoire est appelé ordre logique. Cet ordre correspond grosso modo à l’ordre dans lequel le texte est saisi via le clavier; cela correspond aussi grossièrement à l’ordre phonétique.

et enfin dans la section Assignation des points de code:

Les caractères ayant des caractéristiques communes sont situés ensemble de manière contiguë.

Ce que cela signifie doit être décompressé et comparé à certains alphabets: les premiers caractères Unicode et être compressés en utilisant UTF-8 ou UTF-16, et UTF-32 est non compressé mais les 3 formats fonctionnent de la même manière. La première étape consiste à le convertir de UTF-8 à UTF-32 afin de ne pas avoir un numéro compressé.

L’étape suivante consiste à identifier les points de code Unicode pour les blocs d’alphabet spécifiques. Tous les alphabets sont stockés sous forme de blocs, qui doivent être des multiples entiers de 16 éléments pour des raisons hexadécimales, le plus souvent en groupes de 128, mais les groupes avec majuscules et minuscules sont toujours partitionnés avec la moitié des codes réservés aux l’autre moitié en tant que “codes” inférieurs basés sur le bit le plus significatif. Si les codes ne se divisent pas correctement pour vous, vous n’avez pas la bonne taille de bloc car les symboles et la ponctuation ne sont pas inclus dans la taille du bloc ou le bloc de lettres que vous regardez fait partie d’une famille plus large comme le latin et c’est en fait dans les points de code que ce ne sont ni les majuscules ni les minuscules. Une fois que vous avez extrait les points de code du bloc Unicode, vous pouvez déterminer s’ils contiennent des lettres majuscules et minuscules à partir de l’index de ce bloc.

Si vous regardez la table ASCII, vous verrez que les “lettres anglaises” sont en deux groupes de 32, appelées bloc “Basic Latin” en Unicode et divisées en deux groupes pour les codes “majuscules et minuscules”. “, c’était le modèle utilisé par Unicode Consordium par défaut pour TOUS les alphabets, car le Unicode General Strucutres demande aux ingénieurs:

encourager l’uniformité de l’encodage.

Pour tous les points de code, il existe des groupes de symboles et des signes de ponctuation dupliqués utilisés pour l’optimisation des fonts par le cache du processeur. Sans la duplication des codes, vous risqueriez de perdre le cache.

S’il y a plusieurs lettres majuscules ou minuscules, une seule est choisie et les autres sont emballées dans un ordre qui:

fournit un encodage qui peut être utilisé avec une grande variété d’algorithmes.

Le codage par défaut, parce que les mathématiques sont la langue universelle, est celui des lettres grecques. Certaines langues, telles que le grec, ont plusieurs lettres minuscules. Le motif de conception Unicode est d’abord il y a toujours des symboles et des signes de ponctuation, suivis d’abord par les lettres majuscules les plus utilisées, suivis des codes minuscules les plus fréquemment utilisés, suivis de tous les codes capitol, small et minuscule. regroupés de manière cohérente et logique en fonction de caractéristiques similaires. Si les codes sont mixtes Capitol, Small, Capitol, Small, …, le Capitole est toujours pair, et le petit est toujours étrange.

Maintenant que vous savez comment Unicode est configuré, il suffit d’append ou de soustraire la moitié du nombre de caractères dans la casse du bloc dans la plupart des cas, sauf que si l’alphabet comporte plusieurs lettres majuscules ou minuscules, le motif est le même les lettres grecques, où les majuscules et minuscules les plus utilisées sont décalées d’un demi-bloc, et les lettres minuscules supplémentaires sont regroupées dans des groupes contigus avec les lettres minuscules dupliquées après, comme on peut le voir dans le supplément Latin-1 et Latin Extended-A jeu de caractères.

Par exemple, pour convertir des majuscules en latin de base en minuscules, vous devez append 32 car il y a 64 caractères dans le bloc Latin de base et vous devez soustraire 32 pour convertir des minuscules en majuscules. En revanche, la lettre grecque Sigma a 2 glyphes minuscules. Les lettres grecques communes sont un bloc de 64 et sigma minuscule est 32 loin de sigma majuscule, mais l’autre sigma minuscule est 56 loin de sigma majuscule, qui n’est pas 32! Dans les langues comportant plus de 3 lettres minuscules, les lettres similaires sont regroupées de manière contiguë dans le même ordre qu’elles apparaissent dans la section majuscule ou minuscule; mais cela est en suspens, cela a du sens pour cette langue. Mais reguardless, les groupes de codes majuscules et minuscules ont la même taille.

Enfin, vous devez vous assurer que vous obtenez la bonne taille de bloc. Certains alphabets sont combinés dans leur liste, comme le grec et le copte, mais les codages du code alphabétique sont différents et vous devrez lire la liste des caractères Unicode de Wikipedia et compter manuellement la taille du bloc.