Alguém pode explicar esse comportamento relacionado à codificação?

Alguém pode explicar esse comportamento relacionado à codificação?

Codificação não é meu ponto forte, apesar de ter lido bastante.

Há um arquivo que quero editar, sua extensão é .tdl, mas isso não significa nada em particular.

É um arquivo XML. A primeira linha fica assim:

<?xml version="1.0" encoding="utf-16"?>

Quando tento abrir este arquivo com o gedit, recebo uma grande mensagem em fundo amarelo, dizendo:

"Ocorreu um problema ao abrir o arquivo... O arquivo que você abriu contém alguns caracteres inválidos. Se você continuar editando este arquivo, poderá corromper este documento. Você também pode escolher outra codificação de caracteres e tentar novamente"

A caixa suspensa Codificação de caracteres abaixo diz "Local atual (UTF-8)".

Tento definir isso como "Unicode (UTF-16)" e clico em "Tentar novamente". A mensagem desagradável volta e o menu suspenso volta para "Local Atual (UTF-8)".

Também tentei abrir o arquivo em Arquivo -> Abrir -> Codificação de caracteres: altere de "Detectado automaticamente" para "Unicode (UTF-16)". Mas recebo a mensagem desagradável novamente, novamente com o menu suspenso definido como "Local atual (UTF-8)".

Programaticamente (usando Groovy groovy.xml.XMLParser), sou capaz de analisar esse arquivo e produzir uma groovy.util.Nodeestrutura aparentemente válida. Ainda não cheguei ao estágio de tentar salvar essa estrutura interna do Node, modificada ou não.

Alguém pode me dizer o que há de errado (se houver) com este arquivo e como posso editá-lo com segurança?

Responder1

Em UTF-16, os caracteres estão em dois bytes e para caracteres ASCII o byte mais alto é 0x00.

Por exemplo, "Algo" em UTF-16 é:

00000000  ff fe 53 00 6f 00 6d 00  65 00 74 00 68 00 69 00  |..S.o.m.e.t.h.i.|
00000010  6e 00 67 00 0a 00                                 |n.g...|

( OxFFFENo início está a marca de ordem de bytes, se você vir 0xFEFF você sabe que precisa trocar bytes...).

Os caracteres NUL espalhados por todo o lugar confundem o software ...

Você pode converter para um UTF-8 mais razoável, usando iconv:

iconv -f UTF-16 -t UTF-8 <utf16file >utf8file

E não se esqueça de alterar a codificação no cabeçalho do arquivo

Responder2

Se o arquivo for UTF-16 (codificação típica do Windows), você terá problemas no Linux (UTF-8 nativo, militante...). Pelo menos o GNU emacs diz que suporta UTF-16, nunca o usou com raiva.

Você pode tentar recode(1) para traduzir em UTF-8 (e corrigir cabeçalhos e similares para corresponder), mas isso pode quebrar horrivelmente as ferramentas que esperam UTF-16.

Atualizar:Pensei nisso: recodificar para UTF-8; mutilar, fuso, desfigurar à vontade; recodificar de volta para UTF-16. Dessa forma, você pode usar ferramentas familiares no meio. Masfazercorrigir a codificação UTF-16 anunciada, quem sabe se as ferramentas ficam confusas. Ou talvez as ferramentas de manipulação de XML prestem atenção a isso ...

informação relacionada