En Unicode, certaines combinaisons de caractères ont plus d'une représentation.
Par exemple, le caractère ä peut être représenté par
- "ä", c'est-à-dire le point de code U + 00E4 (deux octets
c3 a4
dans le codage UTF-8), ou - "ä", c'est-à-dire les deux points de code U + 0061 U + 0308 (trois octets
61 cc 88
en UTF-8).
Selon la norme Unicode, les deux représentations sont équivalentes mais dans des "formes de normalisation" différentes, voir UAX # 15: Formes de normalisation Unicode .
La boîte à outils Unix contient toutes sortes d'outils de transformation de texte, sed , tr , iconv , Perl me viennent à l'esprit. Comment puis-je effectuer une conversion NF simple et rapide sur la ligne de commande?
perl -MUnicode::Normalization -e 'print NFC(
... euh ce qui vient ici maintenantRéponses:
Vous pouvez utiliser l'
uconv
utilitaire d' ICU . La normalisation est obtenue par translittération (-x
).Sur Debian, Ubuntu et autres dérivés,
uconv
est dans lelibicu-dev
package. Sur Fedora, Red Hat et autres dérivés, et dans les ports BSD, c'est dans leicu
package.la source
any-nfd
? Il semble que le développement de cet outil ait été abandonné, la dernière mise à jour date de 2005.any-nfd
en parcourant la liste affichée paruconv -L
.sudo apt install icu-devtools
pour exécuteruconv -x any-nfc
, mais ne résolvez pas le problème le plus simple , par exemple unbugText.txt
fichier avec "Iglésias, Bad-á, Good-á" converti enuconv -x any-nfc bugText.txt > goodText.txt
restant le même texte.Python a un
unicodedata
module dans sa bibliothèque standard, qui permet de traduire les représentations Unicode via launicodedata.normalize()
fonction:Exécution avec Python 3.x:
Python n'est pas bien adapté pour les liners shell one, mais cela peut être fait si vous ne voulez pas créer de script externe:
Pour Python 2.x, vous devez ajouter la ligne d'encodage (
# -*- coding: utf-8 -*-
) et marquer les chaînes comme Unicode avec le caractère u:la source
Vérifiez-le avec l'outil hexdump:
convertir avec iconv et vérifier à nouveau avec hexdump:
la source
utf-8-mac
sur Linux et si c'est normal.Pour être complet, avec
perl
:la source
coreutils a un patch pour obtenir un correct
unorm
. fonctionne très bien pour moi sur wchars 4 octets. suivez http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm Le problème restant il y a des systèmes wchar à 2 octets (cygwin, windows, plus aix et solaris sur 32 bits), qui doivent transformer les points de code du haut les avions en paires de substitution et vice versa, et le libunistring / gnulib sous-jacent ne peut pas encore gérer cela.perl a l'
unichars
outil, qui fait également les différentes formes de normalisation sur la ligne de commande. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsla source
Il existe un utilitaire perl appelé Charlint disponible sur
https://www.w3.org/International/charlint/
qui fait ce que vous voulez. Vous devrez également télécharger un fichier depuis
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Après la première exécution, vous verrez Charlint se plaindre d'entrées incompatibles dans ce fichier, vous devrez donc supprimer ces lignes d'UnicodeData.txt.
la source