UTF-8 텍스트 파일에 BOM이 있는지 확인하는 방법은 무엇입니까?

UTF-8 텍스트 파일에 BOM이 있는지 확인하는 방법은 무엇입니까?

UTF-8 텍스트 파일이 있는지 확인하는 방법자재 명세서명령줄에서?

file명령은 다음을 표시합니다.

UTF-8 Unicode text

그러나 이것이 파일에 BOM이 없다는 의미인지는 알 수 없습니다.

우분투 12.04를 사용하고 있습니다.

답변1

file있다면 알려줄게자재 명세서. 간단하게 테스트할 수 있습니다.

printf '\ufeff...\n' | file -
/dev/stdin: UTF-8 Unicode (with BOM) text

일부 셸(예: ash또는 ) 에는 지원되지 않는 내장 명령이 dash있으며 , 이 경우 GNU coreutils(예: )를 사용해야 합니다 .printf\uprintf/usr/bin/printf


참고: 변경 로그에 따르면 file이 기능은 2007년부터 사용되었습니다. 따라서 이것은 현재 모든 컴퓨터에서 작동합니다.

답변2

실행하면 stat fileName정확히 3개의 문자가 표시됩니다. 편집기에서 파일을 열면 아무것도 표시되지 않습니다. 따라서 파일 크기가 3이라는 것을 알면 파일에 BOM이 있다는 것이 분명해집니다.

또한 게시물은여기나에게 매우 도움이 되었습니다.

hexdump -n 3 -C 2.txt
00000000 ef bb bf
ef bb bf // YES

답변3

또 다른 변형 - dos2unix:

$ dos2unix -ib   *.txt
  no-bom f1.txt                 # this file has no BOM
  utf-8  f2.txt                 # this file has BOM + UTF-8
 

이 명령에는 BOM 추가 또는 제거와 같은 파일 형식을 변경하는 옵션이 있습니다.

답변4

BOM이 있는 UTF-8 파일은 3바이트 0xef 0xbb 0xbf로 시작합니다. 이는 U+FEFF 문자의 UTF-8 인코딩입니다.

파일의 처음 3바이트를 읽으면 bash에서 이러한 파일을 효율적으로 찾을 수 있습니다.

find . -type f -size +2c -print0 |
  while IFS= read -rd '' file; do
    IFS= LC_ALL=C read -rd '' -n3 first3 < "$file" &&
      [[ $first3 = $'\xef\xbb\xbf' ]] &&
      printf '%s\n' "$file"
  done

파일의 나머지 부분이 유효한 UTF-8인지 확인하지 않지만 둘 다 file단지 경험적 방법일 뿐입니다.

관련 정보