"tail -f | iconv -fsjis" no genera nada

"tail -f | iconv -fsjis" no genera nada

Quiero tail -fun archivo, pero su contenido está sjiscodificado, por lo que necesito convertirlo a la codificación nativa (utf-8) de mi terminal.

Cuando lo hago

cola -fx | iconov-fsjis

no habrá salida. Como

cola x | iconov-fsjis

funciona, al principio pensé que era un problema de almacenamiento en búfer, pero lo intenté unbuffery stdbufcomo se describe enDesactivar el almacenamiento en búfer en la tuberíano ayudó.

De hecho, incluso después de agregar más de 10k de datos a x, no habría salida, así que supongo que no es un problema de almacenamiento en búfer (el búfer es de 4k, si no me equivoco), pero iconv solo comenzará a generar salida cuando recibe un EOF.

Entonces, ¿cómo puedo seguir mi archivo codificado con sjis?

Respuesta1

(tómalo con una pizca de sal) Hasta donde recuerdo, el problema radica en la forma en que libiconvfunciona. Las codificaciones multibyte necesitan una máquina de estado para decodificarlas y libiconvprefieren recibir caracteres completos, por lo que no puedes simplemente darle medio carácter en una llamada de función y la otra mitad en la siguiente.

Se me ocurren otras dos soluciones, una es un buen método fuera de banda y la otra es un truco dentro de banda.

Cambiar la codificación del emulador de terminal (fuera de banda): una es cambiar la codificación de caracteres en su emulador de terminal, por lo que su codificación nativa es Shift JIS. Acabo de comprobarlo konsoley lo admite. Desde el menú, Ver → Codificación de caracteres → Japonés → sjis. Luego puede simplemente tail -fel archivo y konsolese encargará de decodificar los caracteres multibyte y compararlos con los glifos de fuente.

Transcodificar codificación de terminal sobre la marcha (dentro de banda; mejor): cortesía de Gilles, quien me lo recordó luitdespués de mucho tiempo. Use luit, que debería haber venido con su distribución XOrg (en Debian, es el paquete x11-utils). Úselo así:

$ luit -encoding SJIS -- tail -f x

Esto hará que el terminal transcodifique SJIS hacia/desde la codificación de su terminal y ejecute tail -f x. La desventaja luites que no admite la gran cantidad de codificaciones admitidas por libiconv. La ventaja es que está disponible en casi todas partes.

Transcodificar codificación de terminal sobre la marcha (dentro de banda; hackear):ttyconves un truco que escribí hace muchos años(inicialmente en C, luego rehecho en Python) que se utiliza libiconvpara transcodificar E/S de terminal. Genera un nuevo pseudoterminal y (a) transcodifica los caracteres que escribe desde su codificación local a la codificación remota, y (b) transcodifica los caracteres que recibe de la codificación remota a su codificación local. Lo usé para hablar con servidores que usaban codificaciones no soportadas por los terminales estándar de Linux. Tenga en cuenta que todas las codificaciones remotas con las que lo probé eran codificaciones de un solo byte, por lo que no puedo garantizar que funcione para Shift JIS. No suelo encontrar llamadas para usarlo hoy en día, ya que la mayoría de los sistemas cambian a Unicode.

Así es como lo usarías:

$ ttyconv -rsjis -- tail -f x

La desventaja ttyconves que lo escribí yo, nadie lo usa excepto yo, probablemente esté lleno de errores. Sobresalgo en esto. La ventaja es que utiliza libiconv, por lo que si tu codificación es inusual, es tu mejor opción. Según el último recuento, ttyconv --listadmite 100 codificaciones.

Respuesta2

Al igual que ttyconvtambién hay tconv, escrito en C por Rich Felker.

Ver:Re: Una llamada para arreglar aterm/rxvt/etc...

información relacionada