En Unicode, algunas combinaciones de caracteres tienen más de una representación.
Por ejemplo, el carácter ä puede representarse como
- "ä", ese es el punto de código U + 00E4 (dos bytes
c3 a4
en la codificación UTF-8), o como - "ä", que son los dos puntos de código U + 0061 U + 0308 (tres bytes
61 cc 88
en UTF-8).
De acuerdo con el estándar Unicode, las dos representaciones son equivalentes pero en diferentes "formas de normalización", vea UAX # 15: Formularios de normalización Unicode .
La caja de herramientas de Unix tiene todo tipo de herramientas de transformación de texto, sed , tr , iconv , Perl vienen a la mente. ¿Cómo puedo hacer una conversión NF rápida y fácil en la línea de comandos?
perl -MUnicode::Normalization -e 'print NFC(
... er lo que viene aquí ahora ...Respuestas:
Puede usar la
uconv
utilidad desde la UCI . La normalización se logra a través de la transliteración (-x
).En Debian, Ubuntu y otros derivados,
uconv
está en ellibicu-dev
paquete. En Fedora, Red Hat y otros derivados, y en puertos BSD, está en elicu
paquete.fuente
any-nfd
? Parece que el desarrollo de esta herramienta ha sido abandonado, la última actualización fue en 2005.any-nfd
al navegar por la lista mostrada poruconv -L
.sudo apt install icu-devtools
para ejecutaruconv -x any-nfc
, pero no resolver el problema más simple , por ejemplo, unbugText.txt
archivo con "Iglésias, Bad-á, Good-á" convertido poruconv -x any-nfc bugText.txt > goodText.txt
permanecer el mismo texto.Python tiene un
unicodedata
módulo en su biblioteca estándar, que permite traducir representaciones Unicode a través de launicodedata.normalize()
función:Ejecutando con Python 3.x:
Python no es adecuado para los revestimientos de shell uno, pero se puede hacer si no desea crear un script externo:
Para Python 2.x, debe agregar la línea de codificación (
# -*- coding: utf-8 -*-
) y marcar cadenas como Unicode con el carácter u:fuente
Compruébelo con la herramienta hexdump:
convierta con iconv y verifique nuevamente con hexdump:
fuente
utf-8-mac
Linux y si esto es normal.Para completar, con
perl
:fuente
coreutils tiene un parche para obtener un apropiado
unorm
. funciona bien para mí en 4byte wchars. siga http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm El problema restante son los sistemas wchar de 2 bytes (cygwin, windows, más aix y solaris en 32 bits), que necesitan transformar los puntos de código desde la parte superior planos en pares sustitutos y viceversa, y el libunistring / gnulib subyacente aún no puede manejar eso.Perl tiene la
unichars
herramienta, que también hace las diversas formas de normalización en la línea de cm. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsfuente
Hay una utilidad perl llamada Charlint disponible en
https://www.w3.org/International/charlint/
que hace lo que quieres También deberás descargar un archivo de
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Después de la primera ejecución, verá a Charlint quejándose de entradas incompatibles en ese archivo, por lo que deberá eliminar esas líneas de UnicodeData.txt.
fuente