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.Respostas:
Não , se você especificar a ordem dos bytes,
iconv
não insere uma BOM.Isto é do consórcio Unicode
(minha ênfase)
Espero que
iconv
esteja tentando ser fiel à última dessas diretrizes.Atualizar.
Uma digressão
Na minha opinião:
Uma opção para especificar uma lista técnica certamente seria um recurso adicional útil para o iconv.
Um arquivo UTF-16LE sem uma BOM é utilizável no Windows, embora com esforço adicional algumas vezes. Por exemplo, a caixa de diálogo Abrir arquivo do bloco de notas permite selecionar "Unicode", que é o nome da Microsoft para "UTF-16LE" e (sem surpresa) parece funcionar em arquivos sem uma lista técnica.
Posso abrir um arquivo de teste UTF-16LE (sem BOM) ou um arquivo de teste UTF-8 (sem BOM) no Windows Notepad (XP) da maneira usual, por exemplo, clicando duas vezes no nome do arquivo no explorer. Isso me parece útil. Estou ciente de que, algumas vezes, o Windows adivinhará a codificação incorretamente - nesse caso, você precisará informar a codificação do Bloco de notas ao abrir o arquivo. Esse inconveniente significa que a inclusão de uma lista técnica é preferível para arquivos de texto destinados ao uso no Windows.
Se um aplicativo específico não funcionar com nada além de um arquivo UTF-16LE com BOM, eu concordaria que um arquivo UTF-16LE sem BOM não é utilizável para esse aplicativo específico.
Eu suspeito que, se você puder fazer tudo funcionar com UTF-8 (sem BOM), essa é a melhor solução a longo prazo.
No entanto, a resposta para a pergunta " posso usar o comando iconv para gerar saída UTF-16 com uma BOM e com endianness especificado " é atualmente " Não ".
fonte
.txt
- desde que o arquivo tenha uma BOM.C:\Windows\System32\reg.exe
exporta UTF-16 LE WITH BOM e só lê UTF-16 LE WITH BOM - não lê UTF-16 LE sem BOM e não lê UTF-16 LE sem BOM e não lê UTF-16 BE com BOM - em outras palavras, exige a lista técnica ao ler, mas é melhor que seja a certa! (Felizmente, ele lê UTF-8.)