Inspirado por esta pregunta , ¿puedo usar el iconv
comando para generar una salida UTF-16 con una lista de materiales y con especificidad?
El iconv
comando convierte el 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, pero 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 la endianness de un archivo UTF-16 con BOM comprobando si los dos primeros bytes son FE FF
o FF FE
.
El iconv
comando tiene varias opciones para generar la salida 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 UTF-16 big-endian sin BOM ; parece suponer que si especificó el endianness, no necesita indicarlo en la salida. Del mismo modo, utf-16le
genera little-endian UTF-16 sin BOM.
Esta:
echo hello | iconv -f ascii -t utf-16
genera (en mi sistema Ubuntu x86) little-endian UTF-16 con una BOM, pero he visto un informe de un comando similar que genera UTF-16 big-endian con una BOM, incluso en un sistema little-endian.
Siempre puedo usar utf-16be
o utf-16le
y anteponer la lista de materiales manualmente, pero estoy buscando una solución que solo use el iconv
comando.
Otra solución, si sabes lo que -t utf-16
genera endianness , es:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Lo que me gustaría usar es algo como:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
Pero iconv
no es compatible con eso.
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
iconv
, y me pregunto por qué-t utf-16
parece dejar el endianness sin especificar.iconv -f UTF-8 -t UTF-16
, ejecutar en un sistema little-endian (MacOS), generando UTF-16 big-endian con una lista de materiales, lo que parece muy extraño.Respuestas:
No , si se especifica el orden de los bytes,
iconv
no inserte una lista de materiales.Esto es del Consorcio Unicode
(mi énfasis)
Espero que
iconv
intente ser fiel a la última de estas pautas.Actualizar.
Una digresión
En mi opinión:
Una opción para especificar una lista de materiales sería una característica adicional útil para iconv.
Un archivo UTF-16LE sin una lista de materiales se puede utilizar 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.
Puedo abrir un archivo de prueba UTF-16LE (sin BOM) o un archivo de prueba UTF-8 (sin BOM) en Windows Notepad (XP) de la manera 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 adivinará 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 los archivos de texto destinados a Windows.
Si una aplicación específica no funciona con otra cosa que no sea un archivo UTF-16LE con BOM, entonces estaría de acuerdo en que un archivo UTF-16LE sin BOM no se puede usar para esa aplicación específica.
Sospecho que si puede 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 una salida UTF-16 con una lista de materiales y con una especificidad específica " es actualmente " No ".
fuente
.txt
's, siempre que el archivo tenga una lista de materiales.C:\Windows\System32\reg.exe
exporta UTF-16 LE CON BOM y solo leerá UTF-16 LE CON BOM - no leerá UTF-16 LE sin BOM y no leerá UTF-16 BE con BOM - en otras palabras, exige la lista de materiales al leer, ¡pero es mejor que sea la correcta! (Afortunadamente, se lee UTF-8.)