BOM을 사용하여 UTF-16을 생성하는 iconv

BOM을 사용하여 UTF-16을 생성하는 iconv

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

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

예를 들어:

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

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

항상 그런 것은 아니지만 UTF-16 파일은 유니코드 문자의 2바이트 인코딩인 BOM(바이트 순서 표시)으로 시작하는 경우가 많습니다 U+FEFF. 처음 2바이트가 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

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

이것:

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

(내 x86 Ubuntu 시스템에서) little-endian UTF-16을 생성합니다.~와 함께BOM -- 하지만 리틀 엔디안 시스템에서도 BOM을 사용하여 빅 엔디안 UTF-16을 생성하는 유사한 명령에 대한 보고서를 본 적이 있습니다.

utf-16be언제든지 BOM을 수동으로 사용 하거나 앞에 추가 할 수 있지만 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

아니요, 바이트 순서를 지정하면 iconvBOM을 삽입하지 않습니다.

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

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. 나는 그것을 의심한다만약에BOM 없이 UTF-8을 사용하면 모든 것이 작동하도록 할 수 있습니다. 이는 장기적으로 볼 때 최고의 솔루션입니다.

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

답변2

BOM을 파일에 추가하려면 수동으로 추가할 수 있습니다.

UTF-8 BOM(EF BB BF)의 경우

file='main.cpp'
printf '\xEF\xBB\xBF' > $file.utf8
iconv -f ASCII -t UTF-8 $file >> $file.utf8
mv -v $file.utf8 "converted-$file"

UTF-16BE BOM(FE FF)의 경우

file='main.cpp'
printf '\xFE\xFF' > $file.utf16be
iconv -f ASCII -t UTF-16BE $file >> $file.utf16be
mv -v $file.utf16be "converted-$file"

UTF-16LE BOM(FF FE)의 경우

file='main.cpp'
printf '\xFF\xFE' > $file.utf16le
iconv -f ASCII -t UTF-16LE $file >> $file.utf16le
mv -v $file.utf16le "converted-$file"

메모:

아마도 각 경우의 BOM이 다르다는 것을 알 수 있을 것입니다. 당신은 찾을 수 있습니다자세한 내용은 여기:

관련 정보