BOM이없는 UTF-8과 UTF-8의 차이점은 무엇입니까?


818

BOM이 없는 UTF-8과 UTF-8의 차이점은 무엇입니까 ? 어떤게 더 좋아?


77
UTF-8은 BOM보다 내용으로 더 잘 자동 감지 될 수 있습니다. 방법은 간단합니다. 파일 (또는 문자열)을 UTF-8로 읽으십시오. 성공하면 데이터가 UTF-8이라고 가정하십시오. 그렇지 않으면 CP1252 (또는 다른 8 비트 인코딩)라고 가정하십시오. 비 UTF-8 8 비트 인코딩에는 UTF-8에서 허용되지 않는 시퀀스가 ​​포함됩니다. 순수 ASCII (7 비트)는 UTF-8로 해석되지만 결과도 정확합니다.
Tronic

39
UTF-8 컨텐츠를 위해 큰 파일을 스캔하려면 시간이 걸립니다. BOM을 사용하면이 프로세스가 훨씬 빨라집니다. 실제로는 종종 두 가지를 모두 수행해야합니다. 요즘 범인은 여전히 ​​많은 텍스트 컨텐츠가 유니 코드가 아니며, 여전히 유니 코드 (예 : UTF-8)를 수행하지만 컨텐츠를 다른 코드 페이지로 내보내는 도구에 부딪칩니다.
Jeroen Wiert Pluimers

10
@Tronic 나는 이 경우에 "더 나은"것이 맞지 않다고 생각한다 . 환경에 따라 다릅니다. 당신이 경우 반드시 모든 UTF-8 파일이 표시되는 BOM 당좌보다 BOM을 은 IS "더 나은" 더 빠르고 더 신뢰할 수 있기 때문에, 방법.
mg30rg

32
UTF-8에는 BOM이 없습니다. UTF-8 파일의 시작 부분에 U + FEFF 코드 포인트를 넣을 때이를 처리하기 위해 특별한주의를 기울여야합니다. 이것은 "유니 코드"를 호출하지 않는 것과 같은 마이크로 소프트의 이름 중 하나 일뿐입니다.
tchrist

7
"현대 메인 프레임 (및 AIX)은 거의 엔디안 UTF-8을 인식 하지 못합니다 " UTF-8은 이 없습니다 ! 특정 시스템에 대한 올바른 "순서"에 쌍 또는 4 개의 그룹을 배치하기 위해 바이트를 섞지 않아도됩니다! UTF-8 바이트 시퀀스를 감지하려면 멀티 바이트 시퀀스 "코드 포인트"의 첫 번째 바이트 ( "일반"ASCII가 아닌 바이트)에 MS 비트 세트가 있고 1 개에서 3 개 더 있음을 알아 두는 것이 유용 할 수 있습니다. 연속적으로 덜 중요한 비트들과 리셋 비트가 뒤 따른다. 이러한 세트 비트의 총 수는 해당 코드 포인트에있는 1 바이트 미만이며 모두 MSB 세트를 갖습니다.
SlySven

답변:


773

UTF-8 BOM은 텍스트 스트림 ( )이 시작될 때 일련의 바이트0xEF, 0xBB, 0xBF, 독자는 파일을 UTF-8로 인코딩 된 것으로보다 확실하게 추측 할 수 있습니다.

일반적으로 BOM 은 인코딩 의 엔디안 을 알리는 데 사용 되지만 엔디안은 UTF-8과 관련이 없으므로 BOM이 필요하지 않습니다.

에 따르면 유니 코드 표준UTF-8 파일의 BOM은 사용하지 않는 것이 좋습니다 :

2.6 부호화 체계

... BOM 사용은 UTF-8에 필요하거나 권장되지 않지만 UTF-8 데이터가 BOM을 사용하는 다른 인코딩 형식에서 변환되거나 BOM이 UTF-8 서명으로 사용되는 컨텍스트에서 발생할 수 있습니다. . 자세한 정보는 16.8 절, Specials 의“Byte Order Mark”하위 섹션 을 참조하십시오.


114
권장되지는 않지만 히브리어 변환에 대한 경험을 통해 BOM은 때때로 Excel에서 UTF-8 인식에 중요하며 Jibrish와 히브리어를 차별화 할 수 있습니다.
Matanya

26
권장하지는 않지만 "æøå"를 출력하려고 할 때 powershell 스크립트가 궁금합니다.
Marius

63
표준에서 권장하지 않더라도 허용되며, 가정하거나 추측하는 대신 UTF-8 서명으로 작동하는 것을 선호합니다. 유니 코드 호환 소프트웨어는 그 존재를 처리 할 수 ​​있어야합니다. 따라서 개인적으로 사용하는 것이 좋습니다.
martineau

30
@ bames53 : 예, 텍스트 시스템의 인코딩을 파일 시스템 메타 데이터로 저장하는 것이 이상적인 세상에서 보존하는 것이 더 좋습니다. 그러나 현실 세계에 살고있는 대부분의 사람들은 프로그램이 실행되는 OS의 파일 시스템을 변경할 수 없으므로 유니 코드 표준의 플랫폼 독립적 BOM 서명을 사용하는 것이 가장 현실적인 대안 IMHO처럼 보입니다.
martineau

34
@martineau 어제 저는 UTF-8이 아닌 UTF-8 BOM을 가진 파일을 만났습니다 (CP936이었습니다). 불행히도 UTF-8 BOM으로 인한 엄청난 양의 고통을 일으키는 사람들은 대부분 그것을 잊어 버렸습니다.
bames53

243

다른 훌륭한 답변은 이미 다음과 같이 대답했습니다.

  • UTF-8과 BOM-ed UTF-8의 공식적인 차이는 없습니다
  • BOM이있는 UTF-8 문자열은 다음 3 바이트로 시작합니다. EF BB BF
  • 존재하는 경우 해당 바이트는 파일 / 스트림에서 문자열을 추출 할 때 무시해야합니다.

그러나 이에 대한 추가 정보로서 UTF-8 용 BOM은 문자열이 UTF-8로 인코딩 된 경우 "냄새를 맡는"좋은 방법 일 수 있습니다. 또는 다른 인코딩에서는 합법적 인 문자열 일 수 있습니다.

예를 들어, 데이터 [EF BB BF 41 42 43]은 다음 중 하나 일 수 있습니다.

  • 합법적 인 ISO-8859-1 문자열 " ABC"
  • 합법적 인 UTF-8 문자열 "ABC"

따라서 첫 번째 바이트를 보면서 파일 내용의 인코딩을 인식하는 것이 좋을 수는 있지만 위의 예에서 볼 수 있듯이 이에 의존해서는 안됩니다.

신성이 아닌 인코딩을 알아야합니다.


60
@Alcott : 당신은 올바르게 이해했습니다. 문자열 [EF BB BF 41 42 43]은 단지 바이트 수입니다. 해석 방법을 선택하려면 외부 정보가 필요합니다. 해당 바이트가 ISO-8859-1을 사용하여 인코딩되었다고 생각되면 문자열은 " ABC"입니다. 해당 바이트가 UTF-8을 사용하여 인코딩되었다고 생각되면 "ABC"입니다. 당신이 모른다면, 당신은 알아 내려고 노력해야합니다. BOM은 실마리가 될 수 있습니다. UTF-8로 디코딩 될 때 유효하지 않은 문자가없는 것은 또 다른 것일 수 있습니다 ... 결국, 인코딩을 암기하거나 찾을 수 없다면 바이트 배열은 바이트 배열 일뿐입니다.
paercebal

19
@paercebal ""는 라틴 -1이 유효 하지만 텍스트 파일이 그 조합으로 시작하는 것은 거의 불가능합니다. ucs2-le / be 마커 ÿþ 및 þÿ에 대해서도 마찬가지입니다. 또한 당신은 결코 알 수 없습니다 .
user877329 2016 년

16
@deceze 어쩌면 언어 적으로 유효하지 않을 수도 있습니다. 먼저 ï (괜찮아), 그 사이에 공백이없는 따옴표 (확인 아님). ¿는 스페인어이지만 ï는 스페인어로 사용되지 않습니다. 결론 : 라틴어가 아닌 확실성보다 확실성이 높은 라틴 -1은 아닙니다.
user877329

20
@user 물론, 반드시 의미가있는 것은 아닙니다. 그러나 시스템이 추측에 의존하는 경우 불확실성이 발생합니다. 일부 악의적 인 사용자가 의도적으로이 3 자로 시작하는 텍스트를 제출하면 시스템은 갑자기 BOM을 사용하여 UTF-8을보고 있다고 가정하고 텍스트를 UTF-8로 처리합니다. Latin-1을 사용해야하며 일부 유니 코드 삽입이 발생합니다. 가상의 예일 뿐이지 만 가능합니다. 내용, 마침표로 텍스트 인코딩을 판단 할 수 없습니다.
deceze

40
"인코딩은 신성이 아닌 알려진 것이어야한다." 문제의 마음과 영혼. +1, 좋습니다. 즉, 콘텐츠를 표준화하고 "우리는 항상이 인코딩을 사용하고 있습니다. 기간. 그런 식으로 작성하십시오. 그런 식으로 읽습니다"라고 말하거나 인코딩을 메타 데이터로 저장할 수있는 확장 형식을 개발하십시오. (후자는 아마도 "부트 스트랩 표준 인코딩"을 필요로한다. "인코딩을 알려주는 부분은 항상 ASCII이다"라고 말하는 것처럼)
jpmc26

135

UTF-8로 인코딩 된 파일에 BOM을 넣는 데는 적어도 세 가지 문제점이 있습니다.

  1. 텍스트가없는 파일은 항상 BOM을 포함하므로 더 이상 비어 있지 않습니다.
  2. BOM이 ASCII가 아니기 때문에 UTF-8의 ASCII 서브 세트 내에있는 텍스트를 보유한 파일은 더 이상 자체가 ASCII가 아니기 때문에 일부 기존 도구가 고장 나서 사용자가 이러한 레거시 도구를 교체 할 수 없습니다.
  3. 각 파일의 시작 부분에 BOM이 있으므로 여러 파일을 함께 연결할 수 없습니다.

그리고 다른 사람들이 언급했듯이 BOM이 UTF-8임을 감지하는 것으로 충분하지도 않습니다.

  • BOM을 구성하는 정확한 시퀀스로 임의의 바이트 시퀀스가 ​​시작될 수 있기 때문에 충분하지 않습니다.
  • 마치 UTF-8 인 것처럼 바이트를 읽을 수 있기 때문에 필요하지 않습니다. 성공하면, 정의상 유효한 UTF-8입니다.

8
Repoint 1 "텍스트가없는 파일은 항상 BOM을 포함하기 때문에 더 이상 비어 있지 않습니다", 이것은 (1) 해석 된 컨텐츠 레벨로 OS 파일 시스템 레벨을 병합하고, (2) BOM을 사용하면 비어있는 모든 파일에도 BOM이 있습니다. (1)에 대한 실질적인 해결책은 (2)를하지 않는 것입니다. 본질적으로 불만은 "빈 파일에 BOM을 실용적으로 넣을 수 없으므로 파일 크기를 확인하여 논리적으로 비어있는 파일을 가장 쉽게 감지 할 수 없습니다"로 줄어 듭니다. 여전히 좋은 소프트웨어는 목적을 가지고 있기 때문에 처리 할 수 ​​있어야합니다.
건배와 hth. -Alf

7
포인트 2, "ASCII 텍스트를 포함하는 파일은 더 이상 자체가 ASCII가 아닙니다"는 ASCII를 UTF-8로 병합합니다. ASCII 텍스트를 포함하는 UTF-8 파일은 ASCII가 아니며 UTF-8입니다. 마찬가지로 ASCII 텍스트를 포함하는 UTF-16 파일은 ASCII가 아니며 UTF-16입니다. 등등. ASCII는 7 비트 단일 바이트 코드입니다. UTF-8은 8 비트 가변 길이 확장 ASCII입니다. > 127 개의 값으로 인해 "도구가 고장 나면"8 비트 세계에는 적합하지 않습니다. 간단한 실용적인 해결책 중 하나는 ASCII가 아닌 바이트 값으로 분류되는 도구와 함께 ASCII 파일 만 사용하는 것입니다. 아마도 더 좋은 해결책은 그 좋지 않은 도구를 버리는 것입니다.
건배와 hth. -Alf

8
포인트 3, "각 파일에는 처음에 BOM이 있기 때문에 여러 파일을 함께 연결할 수 없습니다"는 잘못된 것입니다. BOM과 UTF-8 파일을 연결하는 데 아무런 문제가 없으므로 분명히 가능합니다. 아마도 유닉스 랜드 cat깨끗한 결과를 얻지 못할 것이라고 생각했을 것입니다 . 결과는 처음에 BOM 만 있습니다. 당신이 그것을 의미한다면, 그것은 cat해석 된 내용 수준이 아닌 바이트 수준에서 작동하고 비슷한 방식 cat으로 사진을 처리 할 수 ​​없기 때문입니다. 여전히 많은 해를 끼치 지 않습니다. BOM이 너비가 0 인 비 분리 공간을 인코딩하기 때문입니다.
건배와 hth. -Alf

20
@ Cheersandhth.-Alf이 답변은 맞습니다. 당신은 단지 Microsoft 버그를 지적하고 있습니다.
tchrist

9
@ brighty : bom을 추가하여 상황이 개선되지 않습니다.
중복 제거기

84

실제로 실제 문제를 야기하지만 많은 사람들이이를 모르는 BOM 사용법의 예는 다음과 같습니다.

BOM에서 스크립트 중단

쉘 스크립트, Perl 스크립트, Python 스크립트, Ruby 스크립트, Node.js 스크립트 또는 인터프리터가 실행해야하는 기타 실행 파일은 모두 다음 중 하나와 같은 shebang 행으로 시작 합니다.

#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node

이러한 스크립트를 호출 할 때 어떤 인터프리터를 실행해야하는지 시스템에 알려줍니다. 스크립트가 UTF-8로 인코딩 된 경우 처음에 BOM을 포함하도록 유혹 될 수 있습니다. 그러나 실제로 "#!" 문자는 단순한 문자가 아닙니다. 실제로 두 개의 ASCII 문자로 구성 되는 마법의 숫자 입니다. 해당 문자 앞에 무언가 (BOM과 같은)를 넣으면 파일에 다른 마법 번호가있는 것처럼 보이며 문제가 발생할 수 있습니다.

Wikipedia, article : Shebang, section : Magic number 참조 :

shebang 문자는 현재 Unix 계열 시스템의 스크립트 및 기타 텍스트 파일에 일반적으로 사용되는 UTF-8을 포함하여 확장 ASCII 인코딩에서 동일한 2 바이트로 표시됩니다. 그러나 UTF-8 파일은 선택적 바이트 순서 표시 (BOM)로 시작할 수 있습니다. "exec"함수가 바이트 0x23 및 0x21을 구체적으로 감지하는 경우 shebang 전에 BOM (0xEF 0xBB 0xBF)이 있으면 스크립트 인터프리터가 실행되지 않습니다.일부 당국은 POSIX (Unix-like) 스크립트에서 바이트 순서 마크를 사용하지 말 것을 권장합니다. [14] 이러한 이유로 그리고 더 넓은 상호 운용성과 철학적 관심사를 위해. 또한 인코딩에는 엔디안 문제가 없으므로 UTF-8에서는 바이트 순서 표시가 필요하지 않습니다. 인코딩은 UTF-8로만 식별합니다. [강조 추가]

JSON에서 BOM이 잘못되었습니다

RFC 7159, 섹션 8.1 참조 :

구현시 JSON 텍스트의 시작 부분에 바이트 순서 표시를 추가해서는 안됩니다.

BOM은 JSON에서 중복됩니다

JSON에서는 불법 일뿐만 아니라 JSON 스트림에서 사용되는 문자 인코딩과 엔디안을 명확하게 결정하는보다 신뢰할 수있는 방법이 있으므로 문자 인코딩을 결정할 필요없습니다 (자세한 내용은 이 답변 참조).

BOM이 JSON 파서를 깨다

JSON 에서는 불법 이며 필요하지 않을 뿐만 아니라 RFC 4627에 제시된 방법을 사용하여 인코딩을 결정하는 모든 소프트웨어 를 실제로 중단합니다 .

JSON의 인코딩 및 엔디안을 결정하고 NUL 바이트의 처음 4 바이트를 검사합니다.

00 00 00 xx - UTF-32BE
00 xx 00 xx - UTF-16BE
xx 00 00 00 - UTF-32LE
xx 00 xx 00 - UTF-16LE
xx xx xx xx - UTF-8

이제 파일이 BOM으로 시작하면 다음과 같습니다.

00 00 FE FF - UTF-32BE
FE FF 00 xx - UTF-16BE
FF FE 00 00 - UTF-32LE
FF FE xx 00 - UTF-16LE
EF BB BF xx - UTF-8

참고 :

  1. UTF-32BE는 3 개의 NUL로 시작하지 않으므로 인식되지 않습니다.
  2. UTF-32LE 첫 번째 바이트 다음에 세 개의 NUL이 없으므로 인식되지 않습니다.
  3. UTF-16BE는 처음 4 바이트에 하나의 NUL 만 있으므로 인식되지 않습니다.
  4. UTF-16LE는 처음 4 바이트에 하나의 NUL 만 있으므로 인식되지 않습니다.

구현에 따라 모든 것들이 UTF-8로 잘못 해석 된 다음 잘못된 UTF-8로 잘못 해석되거나 거부되거나 전혀 인식되지 않을 수 있습니다.

또한 구현에서 권장하는대로 유효한 JSON을 테스트하면 RFC에 따라 ASCII 문자 <128로 시작하지 않기 때문에 실제로 UTF-8로 인코딩 된 입력조차 거부합니다.

다른 데이터 형식

JSON의 BOM은 필요하지 않으며 불법이며 RFC에 따라 올바르게 작동하는 소프트웨어를 중단합니다. 그것을 사용하지 않는 것은 당연한 일이지만, BOM, 주석, 다른 인용 규칙 또는 다른 데이터 유형을 사용하여 JSON을 깨뜨릴 것을 주장하는 사람들이 항상 있습니다. 물론 누구나 BOM이나 기타 필요한 것을 자유롭게 사용할 수 있습니다. JSON이라고 부르지 마십시오.

JSON 이외의 다른 데이터 형식의 경우 실제로 어떻게 보이는지 살펴보십시오. 유일한 인코딩이 UTF- *이고 첫 번째 문자가 128보다 낮은 ASCII 문자 여야하는 경우 데이터의 인코딩 및 엔디안을 결정하는 데 필요한 모든 정보가 이미 있습니다. 선택적 기능으로도 BOM을 추가하면 더 복잡하고 오류가 발생하기 쉽습니다.

BOM의 다른 용도

JSON 또는 스크립트 이외의 용도에 대해서는 이미 여기에 좋은 답변이 있다고 생각합니다. 실제 문제를 일으키는 BOM 문자의 예이므로 스크립팅 및 직렬화에 대한 자세한 정보를 구체적으로 추가하고 싶었습니다.


5
rfc4627을 대체하는 rfc7159는 실제로 BOM 지원이 그렇게 나쁘지 않을 수 있다고 제안합니다. 기본적으로 BOM이없는 것은 모호한 문제 일 뿐이므로 유니 코드를 인식하지 않는 오래된 Windows 및 Unix 소프트웨어는 여전히 utf-8을 처리 할 수 ​​있습니다.
Eric Grange

2
Perl 스크립트, Python 스크립트, Ruby 스크립트, Node.js와 마찬가지로 JSON을 지원하기 위해 JSON이 업데이트되어야하는 것처럼 들립니다. 이러한 플랫폼이 지원을 포함하지 않기로 선택했다고해서 반드시 BOM 사용이 중단되는 것은 아닙니다. 애플은 몇 년 동안 어도비를 죽이려고 노력해 왔으며, 어도비는 여전히 존재합니다. 그러나 깨달은 포스트.
htm11h

13
@EricGrange, 당신은 BOM을 매우 강력하게 지원하는 것처럼 보이지만 이것이 유비쿼터스이며 보편적으로 유용하며 최적의 최소 "일반 텍스트"형식을 UTF8 이전의 유물로 만들 것이라는 것을 깨닫지 못합니다 ! 일반 텍스트 스트림에 모든 종류의 (대역 내) 헤더를 추가하면 정의 에 따라 가장 간단한 텍스트 파일에 필수 프로토콜이 적용 되어 다시 "간단한"것은 아닙니다! 그리고 어떤 이익을 위해? 모든 지원하기 위해 다른 고대 CP 인코딩 또한 당신이 UTF-8로 착각 할 수 있도록, 서명을하지 않았다가? (BTW, ASCII도 UTF-8입니다. 따라서 BOM도 마찬가지입니다.;)
Sz.

2
이 답변은 제가이 질문에 도달 한 이유입니다! Windows에서 bash 스크립트를 작성하고 Linux에 해당 스크립트를 공개 할 때 많은 문제점이 발생합니다! Jason 파일도 마찬가지입니다.
Tono Nam

2
이 답변에 약 50 번 투표 할 수 있기를 바랍니다. 또한이 시점에서 UTF-8이 표준 전쟁에서 승리했으며 인터넷에서 생성되는 거의 모든 텍스트가 UTF-8이라는 점을 덧붙이고 싶습니다. 가장 많이 사용되는 프로그래밍 언어 (예 : C # 및 Java)는 내부적으로 UTF-16을 사용하지만 해당 언어를 사용하는 프로그래머가 파일을 출력 스트림에 쓸 때 거의 항상 UTF-8로 인코딩합니다. 따라서 UTF-8 파일을 표시하기 위해 BOM을 갖는 것은 더 이상 의미가 없습니다. UTF-8은 읽을 때 사용하는 기본값이어야하며 UTF-8 디코딩이 실패하는 경우에만 다른 인코딩을 시도하십시오.
rmunn

51

BOM이없는 UTF-8과 UTF-8의 차이점은 무엇입니까?

짧은 대답 : UTF-8에서 BOM은 EF BB BF파일 시작 부분에 바이트 로 인코딩됩니다 .

긴 대답 :

원래 유니 코드 는 UTF-16 / UCS-2로 인코딩 될 것으로 예상되었습니다 . BOM은이 인코딩 양식을 위해 설계되었습니다. 2 바이트 코드 단위가있는 경우 해당 2 바이트의 순서를 표시해야하며이를 수행하는 일반적인 규칙은 데이터 시작 부분에 문자 U + FEFF를 "바이트 순서 표시"로 포함시키는 것입니다. 문자 U + FFFE는 영구적으로 할당이 해제되어 존재하므로 잘못된 바이트 순서를 감지 할 수 있습니다.

UTF-8은 플랫폼 엔디안과 상관없이 바이트 순서가 동일하므로 바이트 순서 표시가 필요하지 않습니다. 그러나 EF BB FFUTF-16에서 UTF-8로 변환 된 데이터에서 ( 바이트 시퀀스로 ) 또는 데이터가 UTF-8임을 나타내는 "서명"으로 발생할 수 있습니다 .

어떤게 더 좋아?

없이. Martin Cote가 대답했듯이 유니 코드 표준은 권장하지 않습니다. 비 BOM 인식 소프트웨어에 문제가 발생합니다.

파일이 UTF-8인지 여부를 감지하는 더 좋은 방법은 유효성 검사를 수행하는 것입니다. UTF-8에는 유효한 바이트 시퀀스에 대한 엄격한 규칙이 있으므로 오 탐지 확률은 무시할 수 있습니다. 바이트 시퀀스가 ​​UTF-8처럼 보이면 아마도 그렇습니다.


8
이것은 또한 하나의 잘못된 바이트로 유효한 UTF-8을 무효화합니다 : /
endolith

8
-1 re "BOM을 인식하지 않는 소프트웨어에 문제를 일으 킵니다.", 이것은 저에게 전혀 문제가되지 않았지만, BOM이 없으면 BOM을 인식하지 못하는 소프트웨어 (특히 Visual C ++)에 문제를 일으켰습니다. 문제. 따라서이 문장은 플랫폼에 따라 다르고 좁은 유닉스 영역의 관점이지만 일반적으로 적용되는 것처럼 오도됩니다. 그렇지 않습니다.
건배와 hth. -알프

6
아니요, UTF-8에는 BOM이 없습니다. 이 답변은 잘못되었습니다. 유니 코드 표준을 참조하십시오.
tchrist 2009 년

2
바이트를 볼 때 순수한 ASCII 파일이 있다고 생각할 수도 있습니다. 그러나 이것은 utf-16 파일 일 수 있으며 바이트가 아닌 단어를 봐야합니다. 최신 소프트웨어는 BOM에 대해 알고 있어야합니다. 유효하지 않은 시퀀스, 더 작은 시퀀스를 사용할 수있는 코드 포인트 또는 서로 게이트 인 코드 포인트를 감지하면 여전히 utf-8을 읽을 수 없습니다. utf-16의 경우 고아 대리자가있을 때도 읽기에 실패 할 수 있습니다.
brighty

1
@Alf, 나는 BOM이 아닌 태도를 " 플랫폼 별 , 좁은 유닉스 랜드 관점 "으로 해석하는 것에 동의하지 않습니다 . 나에게, 좁은 마음이 "Unix land"와 거짓말을 할 수있는 유일한 방법은 MS와 Visual C ++가 * NIX보다 먼저 오는 경우였다. MS는 (내가 의도적으로 가정) UTF-8이 아닌 UTF-16의 BOM을 사용하기 시작했다는 사실은 파괴 승진 나에게 제안 sh, perl, g++, 그리고 다른 많은 무료 및 강력한 도구를. 일을 원하십니까? MS 버전 만 구입 하십시오. MS는 \ x80- \ x95 범위의 재앙과 마찬가지로 플랫폼 별 문제를 만들었습니다.
bballdave025

30

BOM이있는 UTF-8이 더 잘 식별됩니다. 나는이 결론에 도달하기 어려웠다. 결과 중 하나가 유니 코드 문자를 포함 하여 CSV 파일 인 프로젝트를 진행 중입니다 .

CSV 파일을 BOM없이 저장하면 Excel은 파일이 ANSI라고 생각하고 횡설수설합니다. 전면에 "EF BB BF"를 추가하면 (예 : UTF-8이있는 메모장을 사용하여 다시 저장하거나 BOM이있는 UTF-8이있는 메모장 ++을 사용하여 다시 저장) Excel에서 잘 열립니다.

RFC 3629는 2003 년 11 월 http://tools.ietf.org/html/rfc3629 에서 "UTF-8, ISO 10646의 변환 형식"인 BOM 문자를 유니 코드 텍스트 파일 앞에 추가하는 것이 좋습니다 (최종 정보는 다음 위치에 있음). http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )


6
Excel에서 사용할 UTF-8 파일을 작성하는 경우이 훌륭한 팁에 감사드립니다. 그러나 다른 상황에서는 여전히 다른 답변을 따르고 BOM을 건너 뛸 것입니다.
barfuin

5
ASCII 만 포함하고 나중에 ASCII가 아닌 파일이 추가 된 파일을 만드는 경우에도 유용합니다. 방금 utf8을 예상하고 사용자 편집을 위해 데이터가있는 파일을 만드는 소프트웨어와 같은 문제가 발생했습니다. 초기 파일에 ASCII 만 포함 된 경우 일부 편집기에서 파일을 연 다음 저장하면 라틴 -1로 끝나고 모든 것이 중단됩니다. BOM을 추가하면 편집기에서 BOM이 UTF8로 감지되고 모든 것이 작동합니다.
Roberto Alsina

1
BOM에서 UTF-8 파일을 올바르게 인식해야하는 여러 프로그래밍 관련 도구를 찾았습니다. Visual Studio, SSMS, SoureTree ....
kjbartel

5
RFC에 BOM을 사용하기위한 권장 사항 은 어디에서 읽 습니까? 기껏해야 어려운 특정 상황에서는 금지하지 않는 것이 좋습니다.
중복 제거기

8
Excel은 그것이 ANSI라고 생각하고 횡설수설보여줍니다 . 문제는 Excel에 있습니다.
Isaac

17

BOM은 어딘가 어딘가에서 호황을 느끼는 경향이 있습니다. 또한 호황을 누리면 (예 : 브라우저, 편집자 등이 인식하지 못하는 경우) 문서 시작시 이상한 문자 (예 : HTML 파일, JSON 응답, RSS 등)로 표시됩니다. 트위터에서 오바마와 대화하는 동안 경험최근의 인코딩 문제 와 같은 종류의 당혹감을 유발합니다. .

디버깅하기 어려운 장소 나 테스트가 무시 될 때 매우 성가시다. 따라서 사용하지 않으면 피하는 것이 가장 좋습니다.


예, BOM없이 UTF-8 대신 UTF-8로 인코딩 된 파일로 인해 발생하는 문제를 식별하는 데 몇 시간을 보냈습니다. (이 문제는 IE7에서만 나타 났으므로 상당히 거위를 추적 할 수있었습니다. Django의 "include"를 사용했습니다.
user984003

미래 독자 : 위에서 언급 한 트윗 문제는 BOM과 밀접한 관련이 없지만, 그렇다면 트윗이 시작될 때와 비슷한 방식으로 트윗이 깨질 수 있습니다.
Halil Özgür

12
아니요, 문제는 Microsoft가 귀하를 잘못 인도했다는 것입니다. UTF-8이라고 부르는 것은 UTF-8이 아닙니다. BOM없이 UTF-8이라고 부르는 것은 실제로 UTF-8입니다.
tchrist

"sic"은 "
un

2
@JoelFan 더 이상 기억이 나지 않지만 저자의 주장에도 불구하고 말장난이 있었을 것 같습니다 :)
Halil Özgür

17

질문 : BOM이없는 UTF-8과 UTF-8의 차이점은 무엇입니까? 어떤게 더 좋아?

다음은 바이트 순서 표시 (BOM) 에 관한 Wikipedia 기사에서 발췌 한 내용입니다. .이 질문에 대한 확실한 대답을 제공한다고 생각합니다.

BOM 및 UTF-8의 의미에서 :

유니 코드 표준은 BOMUTF-8로 허용 하지만 사용을 요구하거나 권장하지는 않습니다. 바이트 순서는 UTF-8에서 의미가 없으므로 UTF-8에서의 유일한 사용은 처음에 텍스트 스트림이 UTF-8로 인코딩되었음을 신호하는 것입니다.

BOM을 사용 하지 않는 인수 :

BOM을 사용하지 않는 주요 동기는 유니 코드를 인식하지 않는 소프트웨어와의 하위 호환성입니다. BOM을 사용하지 않는 또 다른 동기는 UTF-8을 "기본"인코딩으로 권장하는 것입니다.

인수 에 대한 BOM이 사용 :

BOM 사용에 대한 논점은 파일이 없으면 파일이 어떤 문자 인코딩을 사용하는지 판별하기 위해 휴리스틱 분석이 필요하다는 것입니다. 역사적으로 다양한 8 비트 인코딩을 구별하기위한 이러한 분석은 복잡하고 오류가 발생하기 쉽고 때로는 느립니다. Mozilla Universal Charset Detector 및 국제 구성 요소 (Unicode)와 같은 작업을 쉽게하기 위해 여러 라이브러리를 사용할 수 있습니다.

프로그래머는 실수로 UTF-8의 탐지가 똑같이 어렵다고 가정합니다 (대부분의 바이트 시퀀스가 ​​유효하지 않은 UTF-8이 아니기 때문에 이러한 라이브러리는 가능한 모든 바이트 시퀀스를 허용하도록 인코딩하려고합니다). 따라서 모든 유니 코드 인식 프로그램이 이러한 분석을 수행하는 대신 BOM에 의존하지는 않습니다.

특히 Microsoft 컴파일러 및 인터프리터 및 메모장과 같은 Microsoft Windows의 많은 소프트웨어는 ASCII 문자 만 있거나 BOM으로 시작하지 않으면 UTF-8 텍스트를 올바르게 읽지 않으며 저장시 시작에 BOM을 추가합니다. UTF-8로 텍스트. Google 문서는 Microsoft Word 문서가 일반 텍스트 파일로 다운로드 될 때 BOM을 추가합니다.

있는, 더 나은 함께 없이 BOM을 :

IETF는 프로토콜 중 하나 (A)는 항상 사용하는 경우, UTF-8, 또는 (b)는 부호화를 사용하고 있는지 표시하는 다른 방법으로, 다음을 갖는 것이 권장 "서명으로 U + FEFF 사용을 금지해야한다 있습니다."

나의 결론 :

BOM 사용 만 사용소프트웨어 응용 프로그램과의 호환성이 반드시 필요한 경우 .

또한 참조 된 Wikipedia 기사에서 많은 Microsoft 응용 프로그램이 BOM을 사용하여 UTF-8을 올바르게 감지한다고 설명하지만 모든 Microsoft 응용 프로그램 에는 해당되지 않습니다 . 예를 들어,이 가리키는 아웃으로 @barlop UTF-8 프롬프트 윈도우 명령을 사용하는 경우, , 같은 명령 typemoreBOM을가 존재하는 것으로 기대하지 않습니다. BOM 있으면 다른 응용 프로그램에서와 같이 문제가 될 수 있습니다.


chcp명령 이벤트 (UTF-8에 대한 지원을 하지 않고 코드 페이지를 통해 BOM) 65001 .


5
BOM없이 엄격하게하는 것이 좋습니다 . 나는 그것을 발견 .htaccess하고 gzip compression설명한 바와 같이 UTF-8 BOM와 함께 제안에 BOM 추적없이 UTF-8 인코딩으로 인코딩 오류 변경을 제공합니다 여기에 문제를 해결
Chetabahana

1
BOM을 사용하지 않는 또 다른 동기는 UTF-8을 "기본"인코딩으로 장려하는 것입니다. ' -너무 강력하고 유효한 주장으로, 실제로 거기에서 답을 멈출 수있었습니다! ...; -o 보편적 인 텍스트 표현에 대한 더 나은 아이디어가 없다면, 즉. ;) 메타 데이터가없는 모든 고대 1 바이트 인코딩의 혼란은 "하나"를 갖는 대신 순수한 기쁨입니다.)
Sz.

가장 간단한 텍스트 파일 형식 인 "일반 텍스트"에 BOM (또는 무엇이든!)을 추가하는 것이 최상의 범용 텍스트 인코딩 형식 이 "일반"및 "간단한" 형식 이되는 것을 막는 방법에 대한 이 의견 도 참조하십시오 . "headheadless")! ...
Sz.

많은 유틸리티가 실제로 유니 코드를 지원하지 않기 때문에 BOM에서 주로 문제가됩니다 (예를 들어 코드 포인트 중간에서 행복하게 잘릴 것입니다). 대부분의 다른 최신 소프트웨어 환경에서는 인코딩이 명확하지 않을 때마다 (사양 또는 메타 데이터를 통해) BOM을 사용하십시오.
Eric Grange

9

이 질문에는 이미 백만 및 하나의 답변이 있으며 많은 답변이 훌륭하지만 BOM을 사용해야 할 때와 사용하지 않아야 할 시점을 명확히하고 싶었습니다.

언급 한 바와 같이, 문자열이 UTF-8인지 여부를 판별하는 데 UTF BOM (Byte Order Mark)을 사용하는 것은 교육적인 추측입니다. 사용 가능한 적절한 메타 데이터가있는 경우 (예 :charset="utf-8" :) 이미 사용중인 것으로 알고 있지만 그렇지 않은 경우 테스트하고 가정해야합니다. 여기에는 문자열이 나오는 파일이 16 진 바이트 코드 인 EF BB BF로 시작하는지 확인하는 작업이 포함됩니다.

UTF-8 BOM에 해당하는 바이트 코드가 발견되면 UTF-8이라고 가정 할 가능성이 높으므로 그 위치에서 벗어날 수 있습니다. 그러나이 추측을 강요 할 때, 읽는 동안 추가 오류 검사는 여전히 문제가 발생하는 경우 좋은 아이디어입니다. 입력이 확실하지 않아야 하는 경우 BOM이 UTF-8 (예 : latin-1 또는 ANSI)이 아니라고 가정 해야합니다. 이 소스를 기반으로 UTF-8 . 그러나 BOM이없는 경우 인코딩에 대해 유효성 검증을 수행하여 UTF-8인지 여부를 간단히 판별 할 수 있습니다.

BOM이 권장되지 않는 이유는 무엇입니까?

  1. 유니 코드를 인식하지 않거나 호환되지 않는 소프트웨어는 라틴 -1 또는 ANSI라고 가정하고 문자열에서 BOM을 제거하지 않으므로 분명히 문제가 발생할 수 있습니다.
  2. 실제로 필요하지는 않습니다 (콘텐츠가 호환되는지 확인하고 호환되는 인코딩을 찾을 수없는 경우 항상 UTF-8을 대체로 사용하십시오)

해야 당신은 BOM으로 인코딩?

문자셋 태그 또는 파일 시스템 메타를 통해 다른 방식으로 메타 데이터를 기록 할 수없고 BOM과 같이 사용되는 프로그램을 BOM으로 인코딩해야합니다. 이것은 BOM이없는 것이 일반적으로 레거시 코드 페이지를 사용하는 것으로 가정되는 Windows에서 특히 그렇습니다. BOM은 Office와 같은 프로그램에이 파일의 텍스트가 유니 코드임을 알려줍니다. 사용 된 인코딩은 다음과 같습니다.

그것이 실제로 문제가되는 유일한 파일은 CSV입니다. 프로그램에 따라 BOM이 있거나 없어야합니다. 예를 들어, Windows에서 Excel 2007+를 사용하는 경우 BOM을 부드럽게 열고 데이터 가져 오기에 의존하지 않으려면 BOM으로 인코딩해야합니다.


2
대답의 마지막 부분은 100 % 정확합니다. BOM을 사용하는 유일한 이유는 알 수없는 파일을 구문 분석하기 위해 UTF-8을 기본값으로 사용하지 않는 버그가있는 소프트웨어와 상호 운용해야하는 경우입니다.
rmunn

8

일부 파일의 경우 Windows에서도 BOM 이 없어야합니다 . 예는 다음과 같다 SQL*plus또는 VBScript파일입니다. 이러한 파일에 BOM이 포함 된 경우 실행하려고하면 오류가 발생합니다.


8

BOM이있는 UTF-8은 파일에 실제로 비 ASCII 문자가 포함 된 경우에만 도움이됩니다. 포함 된 파일이 없으면 파일을 일반 ASCII로 해석 한 이전 응용 프로그램을 손상시킬 수 있습니다. 이러한 응용 프로그램은 ASCII가 아닌 문자를 발견하면 확실히 실패하므로 BOM은 파일이 더 이상 일반 ASCII로 해석 될 수 없을 때만 추가되어야한다고 생각합니다.

BOM이 전혀없는 것을 선호하고 싶습니다. 오래된 쓰레기가 없으면 쓰레기를 넣으십시오. 이전 응용 프로그램을 대체하는 것은 불가능합니다.

UTF-8의 BOM을 기대하지 마십시오.


7

BOM의 Wikipedia 페이지 하단에 인용되어 있습니다 : http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

"BUT 사용은 UTF-8에 필요하거나 권장되지 않지만 UTF-8 데이터가 BOM을 사용하는 다른 인코딩 형식에서 변환되거나 BOM이 UTF-8 서명으로 사용되는 컨텍스트에서 발생할 수 있습니다."


2
소프트웨어가 인코딩하는 이전 인코딩의 BOM 유무에 따라 BOM을 사용하거나 사용하지 않고 UTF-8을 사용할지 여부를 소프트웨어가 결정하는 예가 있습니까?! 그것은 터무니없는 주장처럼 보인다
barlop

7

BOM이없는 UTF-8에는 BOM이 없으므로 파일 소비자가 파일이 UTF-8로 인코딩되었는지 여부를 알아야하거나 알면 도움이되는 경우를 제외하고 BOM이있는 UTF-8보다 우수하지 않습니다 또는 아닙니다.

BOM은 일반적으로 인코딩의 엔디안을 결정하는 데 유용하며 대부분의 사용 사례에는 필요하지 않습니다.

또한 BOM은 모르거나 신경 쓰지 않는 소비자에게는 불필요한 소음 / 통증이 될 수 있으며 사용자 혼동을 초래할 수 있습니다.


2
"어쨌든 글리프 당 8 비트이므로 UTF-8을 사용하지 않습니다." Er ... 아니요, ASCII-7 글리프 만 UTF-8에서 8 비트입니다. 그 이상은 16, 24 또는 32 비트가됩니다.
Powerlord

3
"BOM은 일반적으로 인코딩의 엔디안을 결정하는 데 유용하며 대부분의 사용 사례에는 필요하지 않습니다."... 엔디안은 사용 사례에 관계없이 UTF-8에는 적용되지 않습니다.
JoelFan

6

나는 이것을 다른 관점에서 본다. 생각 UTF-8 BOM과는 더 는 파일에 대한 자세한 정보를 제공한다. 문제가 발생하는 경우에만 BOM없이 UTF-8을 사용합니다.

내 페이지에서 오랫동안 여러 언어 ( 키릴 문자 )를 사용하고 있으며 BOM없이 파일을 저장하고 편집기를 사용하여 편집하기 위해 파일을 다시 열면 ( cherouvim 도 언급했듯이) 일부 문자가 손상되었습니다.

UTF-8 인코딩으로 새로 작성된 파일을 저장하려고하면 Windows의 클래식 메모장 이 BOM과 함께 파일을 자동으로 저장합니다.

BOM 없이 서버 측 스크립팅 파일 (.asp, .ini, .aspx)을 BOM.html 파일로 개인적으로 저장합니다 .


4
Windows 클래식 메모장에 대한 훌륭한 팁을 주셔서 감사합니다. 나는 이미 똑같은 것을 찾기 위해 시간을 보냈다. 결과적으로 Windows 클래식 메모장 대신 항상 메모장 ++을 사용했습니다. :-)
barfuin

madedit를 사용하는 것이 좋습니다. 16 진 모드에서 바이트와 문자 사이의 1 : 1 기준 대신 utf-8 바이트 시퀀스를 선택하면 하나의 문자를 표시하는 유일한 편집기입니다. UTF-8 파일에 대해 알고있는 16 진 편집기는 madedit처럼 be해야합니다!
brighty

@brighty BOM을 위해 일대일이 필요하다고 생각하지 않습니다. utf-8 BOM이 efbbbf 또는 fffe (잘못 읽은 경우 fffe)임을 인식하는 데는 중요하지 않습니다. 그 바이트를 간단히 삭제할 수 있습니다. 그래도 파일의 나머지 부분에 대한 매핑을하는 것은 나쁘지 않지만 바이트 단위로 바이트를 삭제할 수도 있습니다
barlop

@barlop 파일 내용이 utf-8로 인코딩 된 경우 utf-8 BOM을 왜 삭제 하시겠습니까? BOM은 최신 텍스트 뷰어, 텍스트 컨트롤 및 텍스트 편집기로 인식됩니다. utf-8 시퀀스의 일대일보기는 의미가 없습니다. n 바이트는 하나의 문자가되기 때문입니다. 물론 텍스트 편집기 나 16 진수 편집기는 모든 바이트를 삭제할 수 있지만 유효하지 않은 utf-8 시퀀스로 이어질 수 있습니다.
brighty

bom이있는 @brighty utf-8은 인코딩이고 bom이없는 utf-8은 인코딩입니다. cmd 프롬프트는 bom없이 utf8을 사용합니다. 따라서 utf8 파일이있는 경우 chcp 65001utf8 지원 명령 을 실행하면 bom이없는 utf8입니다. 만약 당신이 type myfilebom이없는 경우에만 올바르게 표시됩니다. 당신이 할 경우 echo aaa>a.a또는 echo אאא>a.a 출력으로 문자를 파일 AA에, 당신은 아무 BOM과는 것이다 출력, CHCP 65001 있습니다.
barlop

6

UTF-8로 인코딩 된 정보를 표시하려는 경우 문제가 발생하지 않을 수 있습니다. 예를 들어 HTML 문서를 UTF-8로 선언하면 문서 본문에 포함 된 모든 것이 브라우저에 표시됩니다.

그러나 우리가 텍스트를 가지고있을 때는 그렇지 않습니다. Windows 나 Linux에 CSV 및 XML 파일 .

예를 들어, 상상할 수있는 가장 쉬운 것 중 하나 인 Windows 또는 Linux의 텍스트 파일은 UTF-8이 아닙니다.

XML로 저장하고 UTF-8로 선언하십시오.

<?xml version="1.0" encoding="UTF-8"?>

UTF-8로 선언 된 경우에도 올바르게 표시되지 않습니다 (읽을 수 없음).

프랑스어 문자를 포함하는 일련의 데이터가 있었는데 신디케이션을 위해 XML로 저장해야했습니다. 맨 처음부터 UTF-8 파일을 작성하지 않고 (IDE 및 "새 파일 작성"에서 옵션 변경) 파일 시작 부분에 BOM을 추가하지 않고

$file="\xEF\xBB\xBF".$string;

프랑스어 문자를 XML 파일로 저장할 수 없습니다.


1
FTM, XML에서는 파일을 ASCII로 유지하고 대신 엔티티 를 사용해야한다고 생각합니다 .
Alois Mahdal

4
나는 이것이 오래된 대답이라는 것을 알고 있지만, 그것이 틀렸다는 것을 언급하고 싶습니다. Linux의 텍스트 파일 (다른 유닉스에서는 사용할 수 없음)은 보통 / are / UTF-8입니다.
Functino

6

한 가지 실질적인 차이점은 Mac OS X 용 셸 스크립트를 작성하고 일반 UTF-8로 저장하면 다음과 같은 응답을 얻을 수 있다는 것입니다.

#!/bin/bash: No such file or directory

사용할 쉘을 지정하는 shebang 행에 대한 응답으로 다음을 수행하십시오.

#!/bin/bash

UTF-8로 저장하면 BOM ( BBEdit 등 )이 모두 적합 하지 않습니다 .


8
그 이유는 Microsoft가 표준의 의미를 바꾸었기 때문입니다. UTF-8에는 BOM이 없습니다. 이들은 데이터 스트림 앞에 가짜 BOM을 삽입 한 Microsoft UTF-8 을 생성 한 다음 실제로는 UTF-8이라는 것을 알려줍니다. 그렇지 않습니다. 그것은 단지 확장되고 손상되었습니다.
tchrist

4

위에서 언급 한 것처럼 BOM이있는 UTF-8은 비 BOM 인식 (또는 호환) 소프트웨어에 문제를 일으킬 수 있습니다. 클라이언트가 WYSIWYG 프로그램을 필요로했기 때문에 Mozilla 기반 KompoZer 로 UTF-8 + BOM으로 인코딩 된 HTML 파일을 편집했습니다 .

저장할 때 레이아웃이 항상 손상됩니다. 이 문제를 해결하는 데 시간이 걸렸습니다. 이 파일들은 Firefox에서 잘 작동했지만 Internet Explorer에서 CSS를 무시하고 레이아웃을 다시 파괴했습니다. 몇 시간 동안 연결된 CSS 파일을 찾은 후 Internet Explorer가 BOMfed HTML 파일을 좋아하지 않는다는 것을 발견했습니다. 다시는

또한 방금 Wikipedia에서 이것을 발견했습니다.

shebang 문자는 현재 Unix 계열 시스템의 스크립트 및 기타 텍스트 파일에 일반적으로 사용되는 UTF-8을 포함하여 확장 ASCII 인코딩에서 동일한 2 바이트로 표시됩니다. 그러나 UTF-8 파일은 선택적 바이트 순서 표시 (BOM)로 시작할 수 있습니다. "exec"함수가 바이트 0x23 0x21을 구체적으로 감지하면 shebang 이전에 BOM (0xEF 0xBB 0xBF)이 있으면 스크립트 인터프리터가 실행되지 않습니다. 일부 당국은 POSIX (Unix-like) 스크립트에서 바이트 순서 마크를 사용하지 말 것을 권장합니다. [15] 이러한 이유로 그리고 더 넓은 상호 운용성과 철학적 관심사를 위해


4

BOM ( Unicode Byte Order Mark) FAQ 는 다음과 같은 간결한 답변을 제공합니다.

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을 사용해서는 안됩니다.


1

에서 http://en.wikipedia.org/wiki/Byte-order_mark :

바이트 순서 표시 (BOM)는 텍스트 파일 또는 스트림의 엔디안 (바이트 순서)을 알리는 데 사용되는 유니 코드 문자입니다. 코드 포인트는 U + FEFF입니다. BOM 사용은 선택 사항이며 사용되는 경우 텍스트 스트림의 시작 부분에 나타납니다. BOM 순서는 바이트 순서 표시 자로 사용되는 것 외에도 텍스트가 인코딩 된 여러 유니 코드 표현 중 하나를 나타낼 수도 있습니다.

파일에서 항상 BOM을 사용하면 UTF-8 및 BOM을 지원하는 편집기에서 항상 BOM이 올바르게 열립니다.

BOM이없는 나의 실제 문제는 다음과 같습니다. 다음을 포함하는 파일이 있다고 가정하십시오.

abc

BOM이 없으면 대부분의 편집기에서 ANSI로 열립니다. 따라서이 파일의 다른 사용자가 파일을 열고 일부 고유 문자를 추가합니다 (예 :

abg-αβγ

죄송합니다. 이제 파일은 여전히 ​​ANSI로되어 있으며 "αβγ"가 6 바이트를 차지하지 않는 것은 3입니다. UTF-8이 아니므로 나중에 개발 체인에서 다른 문제가 발생합니다.


9
비 BOM 인식 소프트웨어의 시작 부분에 스퓨리어스 바이트가 나타나는지 확인하십시오. 예
Romain

1
@Romain Muller : BOM 후 헤더를 보내려고하면 PHP 5에서 "불가능"오류가 발생합니다.
Piskvor

5
αβγ는 ASCII가 아니지만 8 비트 ASCII 기반 인코딩으로 나타날 수 있습니다. BOM을 사용하면 ascii와의 호환성 인 utf-8의 이점을 사용할 수 없습니다 (순수한 ascii가 사용되는 지연 응용 프로그램에서 작동 가능).
ctrl-alt-delor

1
이것은 잘못된 대답입니다. 앞에 BOM이있는 문자열은 완전히 다른 것입니다. 거기에 있어야하는 것은 아니며 모든 것을 망칠뿐입니다.
tchrist

BOM이 없으면 대부분의 편집기에서 ANSI로 열립니다. 전적으로 동의합니다. 이 경우 올바른 코드 페이지를 처리하면 운이 좋지만 실제로는 코드 페이지가 파일의 일부가 아니기 때문에 추측에 불과합니다. BOM은
brighty

1

Visual Studio, Sourcetree 및 Bitbucket pull 요청에 대한 나의 경험은 다음과 같습니다 .

따라서 서명이있는 BOM은 풀 요청을 검토 할 때 각 파일에 빨간색 점 문자가 포함되어 있습니다 (매우 성 가실 수 있습니다).

여기에 이미지 설명을 입력하십시오

마우스를 가져 가면 "ufeff"와 같은 문자가 표시되지만 Sourcetree에는 이러한 유형의 바이트 마크가 표시되지 않으므로 풀 요청으로 끝날 가능성이 높습니다. 2017은 이제 새 파일을 인코딩하므로 Bitbucket 은이를 무시하거나 다른 방법으로 표시해야합니다. 자세한 내용은 여기에 있습니다.

빨간 점 마커 BitBucket diff보기


-4

HTML 파일에서 UTF-8을 사용하고 동일한 페이지에서 Serbian Cyrillic, Serbian Latin, German, Hungarian 또는 일부 이국적인 언어를 사용하는 경우 BOM이있는 UTF가 더 좋습니다.

이것이 저의 의견입니다 (30 년의 컴퓨팅 및 IT 산업).


1
나는 이것도 사실이라고 생각합니다. 첫 번째 255 ASCII 세트 이외의 문자를 사용하고 BOM을 생략하면 브라우저는 해당 문자를 ISO-8859-1로 해석하고 문자가 깨집니다. 위의 답변을 감안할 때 이것은 브라우저 공급 업체가 BOM을 감지하지 못하면 잘못된 일을하는 것 같습니다. 그러나 Microsoft Edge / Mozilla / Webkit / Blink에서 작업하지 않는 한 이러한 앱의 결함으로 작업 할 수밖에 없습니다.
asontu

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