iconv gerando UTF-16 com BOM

9

Inspirado por esta pergunta , posso usar o iconv comando para gerar a saída UTF-16 com uma BOM e com o endianness especificado?

O comando iconv 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, mas nem sempre, começam com uma BOM (Byte Order Mark), que é uma codificação de 2 bytes do caractere Unicode U+FEFF . Você pode determinar o endianness de um arquivo UTF-16 com o BOM, verificando se os dois primeiros bytes são FE FF ou FF FE .

O comando iconv tem 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.

Isto:

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

gera (no meu sistema x86 Ubuntu) little-endian UTF-16 com uma BOM - mas eu vi um relatório de um comando semelhante gerando big-endian UTF-16 com uma BOM , mesmo em um sistema little-endian.

Sempre posso usar utf-16be ou utf-16le e prefixar a BOM manualmente, mas estou procurando uma solução que use apenas o comando iconv .

Outra solução alternativa, se você sabe o que o endianness -t utf-16 gera, é:

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.

EDITAR:

Alguém com acesso a um sistema x86 Mac OSX 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
    
por Keith Thompson 22.01.2012 / 02:46

1 resposta

7

Não , se você especificar a ordem de bytes, iconv não insere uma lista de materiais.

Isso é do The Unicode Consortium

Q: How I should deal with BOMs?

A: Here are some guidelines to follow:

  1. A particular protocol (e.g. Microsoft conventions for .txt files) may require use of the BOM on certain Unicode data streams, such as files. When you need to conform to such a protocol, use a BOM.
  2. Some protocols allow optional BOMs in the case of untagged text. In those cases,
    • Where a text data stream is known to be plain text, but of unknown encoding, BOM can be used as a signature. If there is no BOM, the encoding could be anything.
    • Where a text data stream is known to be plain Unicode text (but not which endian), then BOM can be used as a signature. If there is no BOM, the text should be interpreted as big-endian.
  3. Some byte oriented protocols expect ASCII characters at the beginning of a file. If UTF-8 is used with these protocols, use of the BOM as encoding form signature should be avoided.
  4. Where the precise type of the data stream is known (e.g. Unicode big-endian or Unicode little-endian), the BOM should not be used. In particular, whenever a data stream is declared to be UTF-16BE, UTF-16LE, UTF-32BE or UTF-32LE a BOM must not be used.

(minha ênfase)

Espero que iconv esteja tentando ser fiel à última dessas diretrizes.

Atualizar.

Uma digressão

Na minha opinião:

  1. Uma opção para especificar uma BOM certamente seria um recurso adicional útil para o iconv.

  2. Um arquivo UTF-16LE sem um BOM é utilizável no Windows, embora com esforço adicional às vezes. Por exemplo, o diálogo Abrir Arquivo do Notepad permite que você selecione "Unicode", que é o nome da Microsoft para "UTF-16LE" e (sem surpresa) parece funcionar em arquivos sem uma lista de materiais.

  3. Eu 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 parece útil para mim. Estou ciente de que às vezes o Windows irá adivinhar a codificação incorretamente - Nesse caso você tem que dizer ao Notepad a codificação ao abrir o arquivo. Esse inconveniente significa que incluir uma lista de materiais é preferível para arquivos de texto destinados ao uso no Windows.

  4. Se um aplicativo específico não funcionar com algo diferente de um arquivo UTF-16LE com BOM, concordarei que um arquivo UTF-16LE sem BOM não poderá ser usado por esse aplicativo específico.

  5. Eu suspeito que se você possa fazer tudo funcionar com UTF-8 (sem BOM), que é a melhor solução a longo prazo.

No entanto, a resposta à pergunta " posso usar o comando iconv para gerar saída UTF-16 com uma BOM e com endianness especificado " atualmente é " Não ".

    
por 22.01.2012 / 13:38

Tags