Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 3


|
Conversation : Normalisation UTF-8 |
paul_c_weiss (Membre)
Inscrit le : 07-12-2012
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour! Mon problème se précise. Donc voilà :
Je suis en train de construire une application qui va ajouter des lignes dans un fichier au format xlsx (tableur Excel). Excel maintient une liste des chaînes "uniques" (SharedStrings) au format UTF-8. Pour ajouter des cellules contenant du texte il me faut donc:
- Créer la liste des "textes uniques" à partir du fichier xlsx, - Rechercher mon texte dans cette liste, et si - il est trouvé, prendre le numéro d'ordre correspondant - il n'est pas trouvé, l'ajouter à la liste, avec un nouveau numéro d'ordre.
Jusque là , pas de souci, mais...
Il se trouve que les textes au format UTF-8 peuvent être codés de différentes manières. par exemple, le caractère 'é' peut apparaître comme 0x65 0xCC 0x81 ou alors 0xC3 0xA9... wxString n'a pas de problème avec ça, et traite très bien ces deux "dialectes"...
Mais les chaînes que j'ai dans mon tableur ont diverses provenances (elles viennent du net..), et donc il n'est pas possible de dire a priori comment elles sont codées.
Ainsi, parfois ma comparaison échoue, quand même il y a dans le tableur une chaîne dont l'aspect affiché correspond exactement à la nouvelle chaîne.
En soi, la situation n'est pas dramatique: je peux probablement vivre avec quelques chaînes à double dans mon fichier... Toutefois cela ne me semble pas très "propre".
Il serait donc bienvenu de "normaliser" les chaînes UTF-8, pour qu'elles aient une représentation unique. Il me semble que Windows fourni dans ce but une fonction "NormaliseString" (ou qqch comme ça..). Je n'ai rien trouvé d'équivalent sous wxWidgets.
Donc: - Avez-vous aussi ce problème? - Connaissez-vous un utilitaire adapté? - Sinon, peut-on trouver quelque part des tables de correspondance entre "dialectes".
Merci d'avance
Paul
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
Je suppose que tu as déjà trouvé ce lien, mais au cas où ça ne serait pas le cas, tu peut jeter un coup d'oeil à utf8proc dont les sources sont disponibles suf github (https:/github.com/JuliaStrings/utf8proc).
Il y a l'air d'avoir une sorte de "table de correspondance" (fichier utf8proc_data.c), mais je n'ai pas investigué plus en profondeur pour savoir comment elle était traitée.
Est-ce que tu as essayé de passer par une conversion en utf-16 puis retour en utf-8 pour voir ce que ça donne ?
Tiens nous au courant, ça peut servir.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
paul_c_weiss (Membre)
Inscrit le : 07-12-2012
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne |
Merci! Je vais essayer de décrypter ça.. Mais ça me prendra un certain temps, parce que ça me semble légèrement trapu!
Je vous tiens au courant.
Paul ---------- Bon, alors une longue réponse... J'ai commencé à regarder utf8proc_data.c, mais j'ai trouvé ça d'une grande complication, principalement parce que de nombreuses options sont possibles, et que perso je m'y noie....
Donc, un peu d'exploration sur le net m'a permis de trouver le fichier UnicodeData.txt (https:/www.unicode.org/Public/UCD/lates … deData.txt), qui contient à peu près ce que je cherchais. J'ai analysé son contenu d'après ftp:/unicode.org/Public/3.0-Update/Unic … .0.0.html. J'ai rédigé à ce sujet un petit fichier "Unicode Char Table Analysis.txt",qui contient le résultat de cette analyse, ainsi que quelques références et infos que j'ai trouvé intéressantes...
UnicodeData.txt comprend 32840 lignes, dont bien sûr l'écrasante majorité n'a pour moi que peu d'intérêt, parce qu'elles correspondent à des alphabets plus ou moins improbables, comme par exemple le cunéiforme ou les hiéroglyphes égyptiens.... Une des colonnes, "Caracter decomposition mapping", correspond à ce que je cherche, et devrait permettre de remplacer les caractères précomposés par leur équivalents "combinés". Mais bien sûr, cette colonne est en général vide.... J'ai donc limité la table à ces lignes qui contiennent effectivement un "Caracter decomposition mapping". Il en reste alors 5723...
Il faut bien voir que de nombreuses substitutions correspondent à des opérations d'un intérêt limité dans mon cas. Par exemple, le substitutions des caractères "MATHEMATICAL" correspondent essentiellement à un changement de fonte... de même, la substitution des caractères "CIRCLED" correspond effectivement à la suppression du cercle.. il faut ici bien savoir ce que l'on se veut...
En lisant https:/en.wikipedia.org/wiki/List_of_Un … haracters, j'ai repéré les caractères "latins", ce qui m'a permis d'isoler deux groupes d'intérêt. Le premier correspond aux codepoints 0x00a à 0x341, qui se codent en UTF-8 sur 2 bytes. Le second correspond à la zone 0x1e00 - 0x1ef9 , qui se codent sur 3 bytes. Notez que j'ai abandonné les caractères composés grecs.
J'ai alors rédigé un petit utilitaire qui réalise les opérations suivantes: - Lecture d'un fichier UnicodeData.txt "simplifié" (seules colonnes: Code value, Character name, Caracter decomposition mapping, seules lignes: celle d'intérêt) - Conversion des codepoint en std::string au format UTF-8 - Ecriture d'un std::map permettant une substitution facile...
L'algorithme d'encodage UTF-8 est dû à Ondřej HruÅ¡ka <ondra@ondrovo.com> (https:/gist.github.com/MightyPork/52eda … c9f0ab1da5).
J'ai donc réalisé 2 std::map, l'une pour les caractères encodé sur 2 bytes, l'autre pour ceux encodés sur 3 bytes. Les premier tests semblent fonctionner à satisfaction...
Je mets volontiers "Unicode Char Table Analysis.txt" Ã disposition, ainsi que les 2 std::maps. Comment faire en pratique??
Dernière modification par paul_c_weiss (28-04-2019 16:24:21)
|
|
|