Cuando lo usé cut
hoy, descubrí que no trata un carácter UTF-8 como un carácter, sino 3 caracteres porque tiene 3 bytes de longitud.
Esto parece ser generalmente cierto para muchas herramientas.
¿Hay versiones de los coreutils
que son conscientes de UTF-8?
Mi locale
salida:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Aquí es cuando cut
no funciona
echo 哈哈 | cut -c 2-
��哈
La salida correcta debería ser
哈
si cut -c
funciona con caracteres multibyte.
locale
correctamente? ¿Cuál es la lectura de lalocale
invocación de comandos (sin argumentos)?cut
línea de comando?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Respuestas:
GNU coreutils entiende UTF-8 en general. Por ejemplo
echo 哈哈 | wc -m
, sale correctamente3
en un entorno local UTF-8 (tenga en cuenta que la opción es-m
, no-c
por razones históricas, significa bytes).Esto es un error en
cut
. Mirando la fuente decut
,cut
en caracteres simplemente no se implementa: la-c
opción se trata como un sinónimo de-b
.Una solución alternativa es usar awk. GNU awk hace frente a UTF-8 muy bien.
fuente
Esto parece un error en su compilación / versión de
coreutils
. Puedo reproducir esto en Ubuntu 10.10 Maverick Meerkat pero no en Fedora 15.Si también está usando Ubuntu, puede informar un error a los
coreutils
empaquetadores de Ubuntu ejecutando el siguiente comando:Actualización: Gilles señala en los comentarios que esto es un error en la versión anterior
coreutils
que Fedora ha parcheado. Puede encontrar su parche aquí si desea intentar parcharlo usted mismo para que funcione.fuente
-c
un alias de-b
.