iconv generando UTF-16 con BOM

iconv generando UTF-16 con BOM

Inspirado poresta pregunta, ¿puedo usar el iconvcomando para generar salida UTF-16 con una lista de materiales y con endianidad especificada?

El iconvcomando convierte texto de una codificación a otra.

Por ejemplo:

echo hello | iconv -f ascii -t utf-16

genera una representación UTF-16 de "hello\n".

Los archivos UTF-16 a menudo, aunque no siempre, comienzan con una marca de orden de bytes (BOM), que es una codificación de 2 bytes del carácter Unicode U+FEFF. Puede determinar el endianidad de un archivo UTF-16 con BOM comprobando si los dos primeros bytes son FE FFo FF FE.

El iconvcomando tiene varias opciones para generar resultados UTF-16:

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

Este comando:

echo hello | iconv -f ascii -t utf-16be

genera big-endian UTF-16sin lista de materiales; parece suponer que si especificó el endianidad, no es necesario indicarlo en la salida. De manera similar, utf-16legenera UTF-16 little-endian sin BOM.

Este:

echo hello | iconv -f ascii -t utf-16

genera (en mi sistema Ubuntu x86) little-endian UTF-16conuna lista de materiales, pero he visto un informe de un comando similar que genera UTF-16 big-endian con una lista de materiales, incluso en un sistema little-endian.

Siempre puedo usar utf-16beo utf-16leanteponer la lista de materiales manualmente, pero estoy buscando una solución que solo use el iconvcomando.

Otra solución,siya sabes lo que -t utf-16genera la endianidad, es:

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

lo que haríacomousar es algo como:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

pero iconvno lo admite.

EDITAR :

¿Alguien con acceso a un sistema Mac OSX x86 puede publicar un comentario que muestre el resultado (copiar y pegar) del siguiente comando?

echo hello | iconv -f ascii -t utf-16 | od -x

Respuesta1

No, si especifica el orden de los bytes, iconvno inserta una lista de materiales.

Esto es deEl consorcio Unicode

P: ¿Cómo debo tratar las listas de materiales?

R: Aquí hay algunas pautas a seguir:

  1. Un protocolo particular (por ejemplo, las convenciones de Microsoft para archivos .txt) puede requerir el uso de la lista de materiales en ciertos flujos de datos Unicode, como archivos. Cuando necesite cumplir con dicho protocolo, utilice una lista de materiales.
  2. Algunos protocolos permiten listas de materiales opcionales en el caso de texto sin etiquetar. En esos casos,
    • Cuando se sabe que un flujo de datos de texto es texto sin formato, pero de codificación desconocida, se puede utilizar BOM como firma. Si no hay ninguna lista de materiales, la codificación podría ser cualquier cosa.
    • Cuando se sabe que un flujo de datos de texto es texto Unicode plano (pero no se sabe qué endian), entonces la BOM se puede utilizar como firma. Si no hay ninguna lista de materiales, el texto debe interpretarse como big-endian.
  3. Algunos protocolos orientados a bytes esperan caracteres ASCII al principio de un archivo. Si se utiliza UTF-8 con estos protocolos, se debe evitar el uso de la BOM como firma del formulario de codificación.
  4. Cuando se conoce el tipo preciso de flujo de datos (por ejemplo, Unicode big-endian o Unicode little-endian), no se debe utilizar la lista de materiales. En particular, siempre que un flujo de datos se declare como UTF-16BE, UTF-16LE, UTF-32BE o UTF-32LE una lista de materialesno debeser usado.

(énfasis mío)

Espero iconvintentar ser fiel a la última de estas directrices.


Actualizar.

una digresión

En mi opinión:

  1. Una opción para especificar una lista de materiales sería sin duda una característica adicional útil para iconv.

  2. Un archivo UTF-16LE sin lista de materialesesutilizable en Windows, aunque a veces con un esfuerzo adicional. Por ejemplo, el diálogo Abrir archivo del Bloc de notas le permite seleccionar "Unicode", que es el nombre de Microsoft para "UTF-16LE" y (como era de esperar) parece funcionar en archivos sin una lista de materiales.

  3. Puedo abrir un archivo de prueba UTF-16LE (sin BOM) o un archivo de prueba UTF-8 (sin BOM) en el Bloc de notas de Windows (XP) de la forma habitual, por ejemplo, haciendo doble clic en el nombre del archivo en el explorador. Eso me parece utilizable. Soy consciente de que a veces Windows adivina la codificación incorrectamente, en cuyo caso debe indicarle al Bloc de notas la codificación al abrir el archivo. Este inconveniente significa que es preferible incluir una lista de materiales para archivos de texto destinados a su uso en Windows.

  4. Si una aplicación específica no funciona con nada que no sea un archivo UTF-16LE con BOM, entonces estoy de acuerdo en que un archivo UTF-16LE sin BOM no se puede utilizar para esa aplicación específica.

  5. Sospecho quesipuedes hacer que todo funcione con UTF-8 (sin BOM), esa es la mejor solución a largo plazo.

Sin embargo, la respuesta a la pregunta "¿Puedo usar el comando iconv para generar salida UTF-16 con una lista de materiales y con endianidad especificada?" es actualmente "No".

Respuesta2

Si desea agregar la lista de materiales a un archivo, puede agregarla manualmente:

Para lista de materiales UTF-8 (EF BB BF)

file='main.cpp'
printf '\xEF\xBB\xBF' > $file.utf8
iconv -f ASCII -t UTF-8 $file >> $file.utf8
mv -v $file.utf8 "converted-$file"

Para lista de materiales UTF-16BE (FE FF)

file='main.cpp'
printf '\xFE\xFF' > $file.utf16be
iconv -f ASCII -t UTF-16BE $file >> $file.utf16be
mv -v $file.utf16be "converted-$file"

Para lista de materiales UTF-16LE (FF FE)

file='main.cpp'
printf '\xFF\xFE' > $file.utf16le
iconv -f ASCII -t UTF-16LE $file >> $file.utf16le
mv -v $file.utf16le "converted-$file"

Nota:

Probablemente hayas notado que la lista de materiales en cada caso es diferente. Puedes encontrarmás información aquí:

información relacionada