POSIX 도구를 사용하여 BOM으로 유니코드 파일을 올바르게 처리합니다.

POSIX 도구를 사용하여 BOM으로 유니코드 파일을 올바르게 처리합니다.

사용하려고 할 grep익숙한 질문~의BOM(바이트 순서 표시)유니코드 파일(이 경우 UTF-8). 구체적으로, XYZ패턴으로 시작하는 파일을 찾으려고 하는데 grep '^XYZ', 물론 grepBOM은 세 개의 별도 문자로 처리되며 첫 번째 줄이 로 시작하면 파일의 첫 번째 줄과 일치하지 않습니다 XYZ. 공백( )을 무시하도록 정규식을 업데이트하려고 시도했지만 '^[[:space:]]*XYZ'소용이 없었습니다.

다른 문제가 해결되었습니다.파일 변환또는특히 BOM용, 하지만 POSIX 도구에 유니코드 파일을 올바르게 처리하기 위한 공통 옵션이 있는지 알고 싶습니다. 유니코드 파일을 올바르게 처리 하면 grep파일 내용이 BOM 뒤에서 시작 XYZ하고 다른 줄과 마찬가지로 첫 번째 줄에서 일치한다고 생각합니다.

답변1

유니코드 컨소시엄에는 다음이 포함된 FAQ가 있습니다.BOM을 어떻게 처리하나요?. 이 섹션에는 다음이 포함됩니다.

텍스트 데이터 스트림이 순수 유니코드 텍스트라는 것을 알고 있지만 어떤 엔디안인지 모르는 경우 BOM을 서명으로 사용할 수 있습니다. BOM이 없으면 텍스트는 빅엔디안으로 해석되어야 합니다.

그리고

데이터 스트림의 정확한 유형이 알려진 경우(예: 유니코드 빅엔디안 또는 유니코드 리틀엔디안) BOM을 사용하면 안 됩니다. 특히 데이터 스트림이 UTF-16BE, UTF-16LE, UTF-32BE 또는 UTF-32LE로 선언될 때마다 BOM을 사용해서는 안 됩니다.

UTF-8은언제나엔디안이 없기 때문에 엔디안으로 알려져 있습니다. 따라서 텍스트가 UTF-8이라는 것을 알고 있는 한 "BOM을 사용하면 안 됩니다".

BOM을 불필요하게 사용하더라도 cat첫 번째 파일을 제외한 모든 파일의 BOM은 너비가 0인 줄바꿈 없는 공백으로 처리되기 때문에 잘못된 결과를 반환합니다. 그러나 UNIX의 힘은 필터에 있습니다.

단일 파일 또는 스트림에 대한 작업의 경우 sed "1s/^$(printf '\357\273\277')//"BOM(있는 경우)이 파이프라인에서 제거되어 다른 모든 스트림은 변경되지 않습니다.

여러 파일에 대한 작업의 경우 프로세스 대체 쉘(Bash와 유사하지만 불행히도 POSIX 쉘은 아님)이 유용합니다.

sb() { sed "1s/$(printf '\357\273\277')//" "$@" ; }
cat <(sb file1) <(sb file2) …

답변2

대부분의 POSIX 도구는 문자가 아닌 바이트로 작동합니다. 유니코드 신호는 아무런 의미가 없으므로 다른 데이터처럼 취급됩니다.

답변3

~에서또 다른 대답, 잘못된 BOM 서명이 있는 파일을 처리하고 있는 것 같습니다.

그래서 대답은POSIX 도구는 이미 유니코드(UTF-8) 파일을 올바르게 처리합니다.

유니코드가 잘못된 경우에는 물론 올바르게 처리되지 않지만 다음을 사용할 수 있습니다.다른 질문에서의 BOM 포지셔닝중복 BOM 서명을 처리합니다.

관련 정보