GNU/Linux >> Tutoriales Linux >  >> Linux

“cola -f | Iconv -fsjis” ¿No genera nada?

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

Cuando lo hago

cola -f x | iconov -fsjis

no habrá salida. Como

cola x | iconov -fsjis

funciona, al principio pensé que era un problema de almacenamiento en búfer, pero intenté unbuffer y stdbuf como se describe en Desactivar el almacenamiento en búfer en la tubería no 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 4k, si no me equivoco), pero iconv solo comenzará a generar cuando recibe un EOF.

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

Respuesta aceptada:

(tómalo con pinzas) Por lo que recuerdo, el problema radica en la forma libiconv obras. Las codificaciones de varios bytes necesitan una máquina de estado para decodificarlas y libiconv prefiere recibir caracteres completos, por lo que no puede simplemente darle la mitad de un 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) :uno es cambiar la codificación de caracteres en su emulador de terminal, por lo que su codificación nativa es Shift JIS. Acabo de comprobar konsole , y es compatible con esto. En el menú, Ver→Codificación de caracteres→Japonés→sjis. Entonces puedes simplemente tail -f el archivo y konsole se encargará de decodificar los caracteres multibyte y unirlos con los glifos de fuente.

Transcodifique la codificación del terminal sobre la marcha (en banda; mejor) :cortesía de Gilles, quien me recordó a luit después de mucho tiempo. Usa 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 a/desde la codificación de su terminal y ejecute tail -f x . La desventaja de luit es que no admite la gran cantidad de codificaciones admitidas por libiconv . La ventaja es que está disponible en casi todas partes.

Transcodificar la codificación del terminal sobre la marcha (en banda; piratear) :ttyconv es un truco que escribí hace muchos años (inicialmente en C, luego rehecho en Python) que usa libiconv para transcodificar E/S de terminal. Genera un nuevo pseudoterminal y (a) transcodifica los caracteres que escribe de 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 compatibles con 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 en estos días, con la mayoría de los sistemas cambiando a Unicode.

Relacionado:Eléctrico – ¿Sensor con salida digital TTL?

Así es como lo usarías:

$ ttyconv -rsjis -- tail -f x

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


Linux
  1. ¿El indicador de terminal no se ajusta correctamente?

  2. ¿Por qué este "mientras se lee" funciona en una terminal, pero no en un script de Shell?

  3. ¿Por qué `exit &` no funciona?

  4. gnome-terminal:comando no encontrado

  5. Linux:modpost no construye nada

¿Terminal no aparece en el lanzador?

Qt no crea archivos de salida en carpetas de depuración/liberación en Linux

iconv cualquier codificación a UTF-8

La repetición automática no funciona

Cómo deshabilitar ADVERTENCIA:apt no tiene una interfaz CLI estable...

chrony no registra nada en mi instancia ec2