Inspirado por esta pergunta , posso usar o iconv
comando para gerar saída UTF-16 com uma BOM e com endianness especificado?
O iconv
comando converte texto de uma codificação para outra.
Por exemplo:
echo hello | iconv -f ascii -t utf-16
gera uma representação UTF-16 de "hello\n"
.
Os arquivos UTF-16 geralmente iniciam com uma BOM (Byte Order Mark), que é uma codificação de 2 bytes do caractere Unicode U+FEFF
. Você pode determinar a resistência de um arquivo UTF-16 com a BOM, verificando se os dois primeiros bytes são FE FF
ou FF FE
.
O iconv
comando possui várias opções para gerar a saída UTF-16:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
Este comando:
echo hello | iconv -f ascii -t utf-16be
gera UTF-16 big-endian sem BOM ; parece supor que, se você especificou o endianness, não precisa indicá-lo na saída. Da mesma forma, utf-16le
gera UTF-16 little-endian sem BOM.
Este:
echo hello | iconv -f ascii -t utf-16
gera (no meu sistema x86 Ubuntu) o UTF-16 little-endian com uma BOM - mas eu vi um relatório de um comando semelhante ao gerar UTF-16 big-endian com uma BOM, mesmo em um sistema little-endian.
Sempre posso usar utf-16be
ou utf-16le
preceder a lista técnica manualmente, mas estou procurando uma solução que apenas use o iconv
comando.
Outra solução alternativa, se você souber o que -t utf-16
gera endianness , é:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
O que eu gostaria de usar é algo como:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
mas iconv
não suporta isso.
EDIT:
Alguém com acesso a um sistema Mac OSX x86 pode postar um comentário mostrando a saída (copiada e colada) do seguinte comando?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- e me perguntando por que -t utf-16
parece deixar o endianness não especificado.
iconv -f UTF-8 -t UTF-16
, executada em um sistema little-endian (MacOS), gerando UTF-16 big-endian com uma BOM, o que parece muito estranho.