BOM으로 UTF-16을 생성하는 iconv


11

이 질문 에서 영감을 받아 iconv명령을 사용하여 BOM 및 지정된 엔디안으로 UTF-16 출력을 생성 할 수 있습니까?

iconv명령은 텍스트를 한 인코딩에서 다른 인코딩으로 변환합니다.

예를 들면 다음과 같습니다.

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

의 UTF-16 표현을 생성합니다 "hello\n".

UTF-16 파일은 항상 그런 것은 아니지만 종종 유니 코드 문자의 2 바이트 인코딩 인 BOM (Byte Order Mark)으로 시작합니다 U+FEFF. 처음 두 바이트가 FE FF또는 인지 확인하여 BOM을 사용하여 UTF-16 파일의 엔디안을 확인할 수 있습니다 FF FE.

iconv명령에는 UTF-16 출력을 생성하기위한 몇 가지 옵션이 있습니다.

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

이 명령은

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

BOM없이 빅 엔디안 UTF-16 생성합니다 . 엔디안을 지정한 경우 출력에 표시하지 않아도된다고 가정하는 것 같습니다. 마찬가지로 utf-16leBOM없이 리틀 엔디안 UTF-16을 생성합니다.

이:

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

BOM을 사용 하여 (x86 Ubuntu 시스템에서) 리틀 엔디 언 UTF-16 생성하지만 리틀 엔디안 시스템에서도 BOM을 사용하여 빅 엔디안 UTF-16을 생성하는 비슷한 명령에 대한 보고서를 보았습니다.

BOM을 항상 수동으로 사용 utf-16be하거나 utf-16le추가 할 수 있지만 iconv명령 만 사용하는 솔루션을 찾고 있습니다.

엔디안이 생성 하는 내용을 알고있는 경우 다른 해결 방법 -t utf-16은 다음과 같습니다.

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

내가 것 처럼 사용하는 것은 같은 것입니다 :

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

그러나 iconv그것을 지원하지 않습니다.

편집하다 :

x86 Mac OSX 시스템에 액세스 할 수있는 사람이 다음 명령의 (복사하여 붙여 넣기) 출력을 보여주는 주석을 게시 할 수 있습니까?

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

1
BOM은 데이터의 이식성을 감소 시키지만 이런 식으로 추가
RedGrittyBrick

@ RedGrittyBrick : 휴대 성을 어떻게 줄입니까 (UtF-16 전용)? BOM을 명확하게 생성 할 수 있다는 것을 알고 있습니다. 나는 그냥 사용하는 방법을 찾고 있는데 iconv-t utf-16엔디안이 정교 하지 않은지 궁금 합니다.
Keith Thompson

iconv는 명시 적으로 지정하지 않으면 현재 플랫폼 바이트 순서를 가정합니다. 윈도우 이외의 일부 플랫폼에서 일부 텍스트 처리 도구는 BOM을 예상하지 않으므로 잘못된 일을합니다. 텍스트 파일을 연결하거나 파일 기반 템플릿을 사용하여 컨텐츠를 구성 할 때를 예로들 수 있습니다. "IANA 등록 문자 세트 UTF-16BE 및 UTF-16LE의 경우,이 문자 세트의 이름이 이미 바이트 순서를 결정하므로 바이트 순서 표시를 사용해서는 안됩니다"
RedGrittyBrick

이 질문iconv -f UTF-8 -t UTF-16리틀 엔디안 시스템 (MacOS)에서 실행되어 BOM으로 빅 엔디안 UTF-16을 생성하는 것을 보여줍니다 . 매우 이상하게 보입니다.
Keith Thompson

답변:


9

바이트 순서를 지정하면 Noiconv 는 BOM을 삽입하지 않습니다.

이것은 유니 코드 컨소시엄에서 온 것입니다

Q : BOM을 어떻게 처리해야합니까?

A : 준수해야 할 지침은 다음과 같습니다.

  1. 특정 프로토콜 (예 : .txt 파일에 대한 Microsoft 규칙)은 파일과 같은 특정 유니 코드 데이터 스트림에서 BOM을 사용해야 할 수 있습니다. 이러한 프로토콜을 준수해야하는 경우 BOM을 사용하십시오.
  2. 태그가없는 텍스트의 경우 일부 프로토콜은 선택적 BOM을 허용합니다. 이 경우
    • 텍스트 데이터 스트림이 일반 텍스트이지만 인코딩이 알려지지 않은 경우 BOM을 서명으로 사용할 수 있습니다. BOM이 없으면 인코딩이 될 수 있습니다.
    • 텍스트 데이터 스트림이 일반 유니 코드 텍스트로 알려져 있지만 (엔디안은 아님) BOM을 서명으로 사용할 수 있습니다. BOM이없는 경우 텍스트는 빅 엔디안으로 해석되어야합니다.
  3. 일부 바이트 지향 프로토콜은 파일 시작 부분에 ASCII 문자가 필요합니다. UTF-8을 이러한 프로토콜과 함께 사용하는 경우 BOM을 인코딩 양식 서명으로 사용하지 않아야합니다.
  4. 정확한 유형의 데이터 스트림이 알려진 경우 (예 : 유니 코드 빅 엔디안 또는 유니 코드 리틀 엔디안) BOM을 사용해서는 안됩니다. 특히, 데이터 스트림이 UTF-16BE, UTF-16LE, UTF-32BE 또는 UTF-32LE로 선언 될 때마다 BOM을 사용 해서는 안됩니다 .

(내 강조)

내가 기대하는 iconv이 가이드 라인의 마지막에 충실하려고합니다.


최신 정보.

탈선

내 의견으로는 :

  1. BOM을 지정하는 옵션은 확실히 iconv에 유용한 추가 기능입니다.

  2. BOM 없는 UTF-16LE 파일 때때로 추가 노력이 필요하지만 Windows에서 사용할 수 있습니다. 예를 들어 메모장의 파일 열기 대화 상자를 사용하면 "UTF-16LE"의 Microsoft 이름 인 "유니 코드"를 선택할 수 있으며 BOM없이 파일에서 작동하는 것 같습니다.

  3. 일반적인 방법으로 탐색기에서 파일 이름을 두 번 클릭하여 Windows 메모장 (XP)에서 UTF-16LE 테스트 파일 (BOM없이) 또는 UTF-8 테스트 파일 (BOM없이)을 열 수 있습니다. 그것은 나에게 유용한 것 같습니다. Windows에서 인코딩이 잘못 추측 될 수 있음을 알고 있습니다.이 경우 파일을 열 때 메모장에 인코딩을 알려 주어야합니다. 이 불편 함은 Windows에서 사용하기위한 텍스트 파일에 BOM을 포함하는 것이 바람직하다는 것을 의미합니다.

  4. 특정 응용 프로그램이 BOM이있는 UTF-16LE 파일 이외의 다른 파일과 작동하지 않으면 BOM이없는 UTF-16LE 파일을 해당 특정 응용 프로그램에 사용할 수 없다는 데 동의합니다.

  5. 나는 것으로 의심되는 경우, 당신은 UTF-8 (BOM 없음)으로 모든 작업을 할 수 있습니다, 즉 장기적으로 최고의 솔루션입니다.

그러나 질문 "에 대한 대답 은 iconv 명령을 사용하여 BOM과 함께 UTF-16 출력을 생성 할 수 있으며 지정된 엔디안 " "이 현재" 아니요 "입니다.


1
그리고 첫 번째 지침 인 A.1은 어떻습니까? f x86 Windows 시스템에서 사용할 수있는 유니 코드 텍스트 파일을 생성하려면 BOM이있는 리틀 엔디안 UTF16 파일이어야합니다 .
Keith Thompson

@KeithThompson : 시스템은 UTF16LE과 UTF16BE 를 모두 수용해야합니다 . .txt파일에 BOM이있는 한 Windows 메모장은 둘 다를 허용합니다 .
user1686

@KeithThompson : 지침 1이 우선해야한다는 데 동의하지만 iconv는 BOM을 지정하는 방법을 제공하지 않습니다. 원래 질문에 대한 대답은 단순히 "아니오"입니다.
RedGrittyBrick

내가 바라는 답이 아니라 답과 철저한 대답입니다!
Keith Thompson

2
이 답변은 저에게 도움이되었습니다. 왜 내가 망쳐 졌는지 알게되었습니다. 레지스트리에서 내보내기 / 가져 오기위한 표준 Windows 프로그램 C:\Windows\System32\reg.exe은 UTF-16 LE WITH BOM을 내보내고 UTF-16 LE WITH BOM 만 읽습니다 -BOM 없이 UTF-16 LE 읽지 않으며 BOM과 함께 UTF-16 BE 읽지 않습니다 - 즉, 읽을 때 BOM이 필요하지만 올바른 것이 더 좋습니다. (다행히도 UTF-8을 읽습니다.)
davidbak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.