emacs가 XML 파일에서 BOM을 제거하지 않도록 설정


8

다른 응용 프로그램에서도 읽을 수있는 XML 파일을 편집하기 위해 Emacs를 사용합니다. 다른 응용 프로그램에서는 파일이 바이트 순서 표시 자 (BOM)로 시작해야합니다. 그러나 Emacs는 파일을 편집 할 때마다 BOM을 제거하는 것으로 보입니다. Emacs가 BOM을 떠나도록하는 방법이 있습니까?


이것이 schtasks에 대한 XML 파일을 편집 할 때 인코딩을 유니 코드에서 유니 코드 빅 엔디안으로 변경 한 다음 작동하지 않는 이유는 무엇입니까?
js2010

답변:


9

Emacs는 사용중인 코딩 시스템에 따라 BOM을 작성하거나 작성하지 않습니다. Emacs는 파일을 방문 할 때 사용하는 코딩 시스템을 자동으로 선택합니다.

코딩 시스템을 utf-8-with-signature로 변경하면 Emacs가 BOM을 작성하도록 지시합니다.

방문한 파일의 코딩 시스템을 변경하려면

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

파일 변수 를 설정하여 Emacs가 특정 파일에 사용하는 코딩 시스템을 설정할 수 있습니다 . 이를 수행하는 방법을 배우 려면 훌륭한 매뉴얼 섹션 57.3.4 파일의 로컬 변수를 참조하십시오 .


굉장히, 내가 기대했던 바로 그 종류의 대답! 감사합니다!
Vebjorn Ljosa

5

리처드 호스킨스의 대답에 후속 다음과 같은 경우에 결코 는 BOM이 이맥스 숨길 수 싶지,이 조각과 함께 * 가진 - - 서명 코딩을 해제 할 수 있습니다 :

(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))))

BOM은 U + FEFF이며 "폭이 0이 아닌 공간"이며 이맥스 23.1.1에서 상자로 표시되지 않습니다. 대신 파일의 맨 위 줄이 약간 아래로 이동하고 때로는 상자가 첫 번째 줄 주위에 표시되지만 BOM이 있음을 확인하고 필요한 경우 삭제하십시오.


1

이맥스 "자체"는 BOM을 망쳐서는 안됩니다. 실제로 그렇게하고 있다면 BOM을 제거하는 XML 파일을 편집하는 데 사용하는 Emacs "모드"를 구현하는 코드 여야합니다. 어느 쪽인지 말하지 않기 때문에 해당 모드에 대한 설명서 만 참조하거나 파일을 fundamental-mode(또는 유사한 비파괴 모드) 열면 됩니다. 또는 M-x find-file-literally다른 모든 것이 실패하면 시도 하십시오.


사용 XML 모드 (즉, SGML - 모드)하지만 문제는 다른 것 같다 : 내가 가진 파일을 열 경우 find-file-literally어떻게 다음과 M-x sgml-mode의 BOM이 제거되지 않습니다. 특수 문자는 문자 그대로 파일을 방문 할 때 UTF-8로 인코딩되지 않기 때문에 기본 형식 변환 및 문자 코드 변환 코드에서 BOM이 제거되는 위치를 알아내는 것이 좋습니다.
Vebjorn Ljosa

0

필자의 테스트에서 UTF-8파일을 편집 해도 인코딩이 변경되지 않고 BOM이 유지됩니다 ( efbb bf). (nxml 모드)

그런데,이 사이에서 변할 수 xml-modenxml-mode또는 이맥스 버전 (24 대 26). 하단에 모드가 표시됩니다.

유니 코드 ( UTF-16little endian)로 인코딩 된 XML 파일 인 Emacs를 편집 하면 인코딩이 UTF-16big endian으로 변경됩니다 . 아마 그가 말한 것일 수도 있습니다.

그러나 BOM은 변경, 아직 거기 fffeffef, 그리고 널 대신 짝수 바이트의 홀수 바이트에 있습니다. hexl 모드에서 볼 수 있습니다.

샘플 xml 파일. 인코딩 속성은 emacs가 xml-mode 또는 nxml-mode로 저장할 때 인코딩을 지시합니다. BOM을 먼저 확인하기 위해 향후 버전이 패치됩니다.

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

Emacs는 UTF-16으로 UTF-16BE, Windows는 UTF-16LE(BE 및 LE는 Emacs에서 인코딩 속성으로 작동하지 않습니다)로 사용합니다. 인코딩 속성은 아마도 여기서 문제의 핵심 일 것입니다.

Powershell에 저장하면 utf-16le로 다시 변환됩니다.

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

encoding = "UTF-16LE"및 encoding = "UTF-16BE"를 사용하면 bom이 제거되어 파일을 emacs에서 인식 할 수 없습니다. 이것은 패치 될 확인 된 버그입니다 : http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.