Faça o emacs não remover a lista técnica dos arquivos XML

8

Eu uso o Emacs para editar um arquivo XML que também é lido por outro aplicativo. O outro aplicativo requer que o arquivo comece com um marcador de ordem de bytes (BOM). No entanto, o Emacs parece remover a lista técnica toda vez que edito o arquivo. Existe uma maneira de fazer o Emacs deixar a lista técnica em paz?

Vebjorn Ljosa
fonte
É por isso que quando eu edito um arquivo xml para schtasks, ele altera a codificação de unicode para unicode big endian e depois não funciona?
precisa saber é

Respostas:

9

O Emacs escreverá uma lista técnica ou não, dependendo do sistema de codificação que estiver usando. O Emacs escolhe automaticamente o sistema de codificação usado ao visitar um arquivo.

Você pode alterar o sistema de codificação para utf-8-with-signature, o que instruirá o Emacs a escrever a BOM.

Para alterar o sistema de codificação de um arquivo visitado:

C-x RET r utf-8-with-signature RET

Você pode definir o sistema de codificação que o Emacs usa para um arquivo específico, definindo uma variável de arquivo . Consulte a seção manual fina 57.3.4 Variáveis ​​locais em arquivos para aprender como fazer isso.

Richard Hoskins
fonte
Incrível, exatamente o tipo de resposta que eu esperava! Obrigado!
Vebjorn Ljosa 17/09/09
5

Acompanhamento da resposta de Richard Hoskins: se você nunca deseja que a BOM seja oculta pelo emacs, pode desativar os códigos * -with-signature com este trecho:

(setq auto-coding-regexp-alist
  (delete (rassoc 'utf-16be-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-16le-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-8-with-signature auto-coding-regexp-alist)
          auto-coding-regexp-alist))))

A lista técnica é U + FEFF, o “espaço sem quebra de largura zero”, e não aparece como uma caixa no meu emacs 23.1.1. Em vez disso, a linha superior do arquivo se moveu ligeiramente para baixo e às vezes uma caixa aparece em torno da primeira linha - mas você pode ver que a lista técnica está lá e excluí-la, se necessário.


fonte
1

O Emacs "em si" não deve mexer com a lista técnica; se realmente estiver fazendo isso, teria que ser o código que implementa o "modo" do Emacs que você está usando para editar seus arquivos XML e remover a BOM. Como você não diz qual é, só posso consultar a documentação desse modo ou abrir os arquivos fundamental-mode(ou no modo não destrutivo semelhante). Ou tente M-x find-file-literallyse tudo mais falhar.

Urso de pelúcia
fonte
use o modo xml (ou seja, modo sgml), mas esse problema parece estar em outro lugar: se eu abrir o arquivo find-file-literallye o fizer M-x sgml-mode, a BOM não será removida. Como caracteres especiais não são codificados em UTF-8 ao visitar um arquivo literalmente, seria bom descobrir onde, na conversão de formato subjacente e no código de conversão de código de caractere, a BOM é removida.
Vebjorn Ljosa 15/09/09
0

No meu teste, editar um UTF-8arquivo não altera a codificação e a BOM permanece ( efbb bf). (modo nxml)

Bem, isso pode variar entre xml-modee nxml-mode, ou a versão do emacs (24 vs 26). Diz o modo na parte inferior.

Se você editar um arquivo XML do Emacs e codificado em unicode ( UTF-16little endian), ele mudará a codificação para UTF-16big endian. Talvez seja sobre isso que ele está falando.

Mas a lista técnica ainda está lá, alterada de fffepara ffef, e os nulos estão no byte ímpar, em vez do par. Você pode vê-lo no modo hexl.

Arquivo xml de amostra. O atributo encoding direciona a codificação quando o emacs a salva no modo xml ou nxml. Uma versão futura será corrigida para verificar primeiro a lista técnica.

<?xml version="1.0" encoding="UTF-16"?>
<hi />

Parece que o Emacs aceita UTF-16como UTF-16BE, enquanto o Windows aceita como UTF-16LE(BE e LE não funcionam no Emacs para o atributo de codificação). O atributo de codificação é provavelmente a chave para os problemas aqui.

Salvá-lo no PowerShell o converterá novamente em utf-16le.

[xml]$xml = get-content test.xml; $xml.save('test.xml')

Com codificação = "UTF-16LE" e codificação = "UTF-16BE", o bom é removido, tornando o arquivo irreconhecível no emacs. Este é um bug confirmado que será corrigido: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

js2010
fonte