coreutils que son conscientes de utf?

16

Cuando lo usé cuthoy, 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 coreutilsque son conscientes de UTF-8?

Mi localesalida:

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 cutno funciona

echo 哈哈 | cut -c 2-
��哈

La salida correcta debería ser

si cut -cfunciona con caracteres multibyte.

Chao Xu
fuente
¿Lo has configurado localecorrectamente? ¿Cuál es la lectura de la localeinvocación de comandos (sin argumentos)?
alex
He actualizado con la configuración regional.
Chao Xu
OK, ¿puedes agregar algún ejemplo de tu cutlínea de comando?
alex
Puede confirmar esto en Ubuntu 10.04 con echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Lo triste es que, 3 años después, esto sigue siendo cierto en Ubuntu 13.10 ...
Dr. Mike

Respuestas:

13

GNU coreutils entiende UTF-8 en general. Por ejemplo echo 哈哈 | wc -m, sale correctamente 3en un entorno local UTF-8 (tenga en cuenta que la opción es -m, no -cpor razones históricas, significa bytes).

Esto es un error en cut. Mirando la fuente decut , cuten caracteres simplemente no se implementa: la -copció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.

awk '{print substr($0,2,length)}'
Gilles 'SO- deja de ser malvado'
fuente
8
Valdría la pena presentar un informe de errores (incluso si termina siendo un duplicado) para molestar a los mantenedores de Coreutils para que realmente solucionen errores como este, en lugar de simplemente agregar trucos estúpidos y utilidades de juguetes que nadie necesita ...
R .. GitHub STOP AYUDANDO A ICE
3

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.

[parches @ holocene ~] $ cat / etc / fedora-release 
Fedora versión 15 (Lovelock)
[parches @ holocene ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[parches @ holoceno ~] $ echo 哈哈 | corte -c 2-
哈
[parches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | Versión grep
Versión: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | corte -c 2-
哈

Si también está usando Ubuntu, puede informar un error a los coreutilsempaquetadores de Ubuntu ejecutando el siguiente comando:

apport-bug coreutils

Actualización: Gilles señala en los comentarios que esto es un error en la versión anterior coreutilsque Fedora ha parcheado. Puede encontrar su parche aquí si desea intentar parcharlo usted mismo para que funcione.

Parches
fuente
Acabo de mirar la fuente, y es un error aguas arriba que Fedora aparentemente parchó. La fuente ascendente simplemente crea -cun alias de -b.
Gilles 'SO- deja de ser malvado'
@Gilles: Interesante. Me vinculé al parche de Fedora en mi respuesta en caso de que alguien quiera intentar solucionarlo por sí mismo.
Parches del
El enlace está roto.
corvus_192