유니 코드 센티넬 값을 사용할 수 있습니까?


14

파일 형식을 원하고 있으며 올바르게하고 싶습니다. 이진 형식이므로 파일의 첫 번째 바이트 (또는 바이트)가 유효한 텍스트 문자를 구성 해서는 안됩니다 (PNG 파일 헤더 1에서와 동일 ). 이를 통해 형식을 인식하지 못하는 도구는 처음 몇 바이트를보고 여전히 텍스트 파일이 아님을 확인할 수 있습니다.

위의 모든 코드 포인트 0x7F는 유효하지 않은 US-ASCII이므로 쉽게 사용할 수 있습니다. 그러나 유니 코드의 경우 완전히 다른 이야기입니다. 유니 코드 개인 사용 문자 , 비 문자 및 센티넬 FAQ 에서 찾은 유효한 유니 코드 문자 외에도 개인용 문자 , 문자가 아닌 문자센티넬이 있습니다.

파일의 시작 부분에서 유효하지 않은 US-ASCII, UTF-8, UTF-16LE 및 UTF-16BE를 초래할 수있는 센티넬 바이트 시퀀스는 무엇입니까?

  • 분명히 첫 번째 바이트는 0x80유효한 US-ASCII (제어) 문자이므로 아래 값을 가질 0x00수 없으므로 사용할 수 없습니다.
  • 또한 개인용 문자 는 유효한 유니 코드 문자이므로 해당 코드 포인트도 사용할 수 없습니다.
  • 리틀 엔디안 및 빅 엔디안 UTF-16 모두에서 작동해야하므로 리버스 가 유효한 유니 코드 문자이므로 이와 같은 비 문자0xFFFE 도 불가능합니다 0xFEFF.
  • 위에서 언급 한 FAQ는 문자가 아닌 문자 를 사용하지 않는 것이 좋습니다 . 유효 하지 않은 문자 는 여전히 유효한 유니 코드 시퀀스를 초래하므로 0xFFFF그림과는 다릅니다.

미래에 대비할 수있는 센티넬 값은 무엇입니까?


1 ) PNG 형식의 첫 번째 바이트는 ASCII가 아닌 0x89값을 가지며 그 뒤에 문자열이옵니다 PNG. PNG의 처음 몇 바이트를 읽는 도구는 해석 할 수 없으므로 이진 파일이라고 판단 할 수 있습니다 0x89. 반면 GIF 파일은 유효하고 읽을 수있는 ASCII 문자열 GIF과 3 개의 유효한 ASCII 문자로 직접 시작됩니다 . GIF의 경우 도구가 읽을 수있는 텍스트 파일인지 확인할 수 있습니다. 텍스처가 아닌 바이트 시퀀스로 파일을 시작한다는 아이디어는 Andy McFadden의 Designing File Formats 에서 비롯되었습니다 .


3
Since it is a binary format, the first bytes of the file should not form valid textual characters-이 응용 프로그램이 파일 형식을 식별하는 방법을 보여주는 매직 파일 (/ usr / share / magic 또는 많은 유닉스 시스템의 / etc / magic)을 살펴보십시오. PNG 파일은 처음부터 시작 \x89PNG\x0d\0a\x1a\x0a합니다. "PNG"는 원시 문자열입니다. 시퀀스 \x89등은 인쇄 불가능한 바이트이다.

@MichaelT 예, PNG는 이진 형식이므로 첫 번째 바이트는 유효한 텍스트 문자를 형성하지 않습니다. 그게 내 뜻이야 나는 당신의 요점을 보지 못했습니까?
Daniel AA Pelsmaeker

7
그게 예입니다. .gif는로 시작합니다 GIF8. SGI movi 파일은로 시작합니다 MOVI. zip 아카이브 파일의 한 스타일은로 시작하며 ZZ, 가장 인기있는 pkzip 형식은로 시작합니다 PK. 첫 번째 바이트가 유효하지 않은 텍스트 문자이어야한다는 제약 조건이 와일드에서 발견 된 것과 일치하지 않는 것 같습니다. 왜 이것이 요구 사항인지 궁금합니다.

3
다른 프로그램이 알 수없는 파일을 볼 때 어떻게 동작하는지 신경 쓰십니까? 나에게, PNG 파일과 같은 서명 시퀀스는 센티넬 시퀀스보다 훨씬 유용합니다. 콘텐츠가 간단한 스트림 프로토콜을 통해 전송되면 수신자는 다음 바이트를 처리하는 방법을 즉시 결정할 수 있습니다. 모든 사람이 자신의 형식을 식별하기 위해 사용하기 시작하면 Omani-Sentinel 시퀀스는 순서가 없습니다.
Codism

2
@Virtlink, 나는 파일 형식으로 어떤 바이트를 사용하는지 특별히 신경 쓰지 않는다. 그러나 당신은 ascii 문자를 사용하는 것이 잘못되었다고 주장했습니다 ... 그러나 나는 여기에서 그 주장을 뒷받침하는 것을 보지 못했습니다. 수십 년 동안 문제없이 ASCII 문자를 사용한 형식)
GrandmasterB

답변:


16

0xDC 0xDC

  • 분명히 유효하지 않은 UTF-8 및 ASCII
  • UTF-16의 엔디안에 관계없이 리드 위치에서 짝을 이루지 않은 트레일 대리. 그보다 UTF-16이 유효하지 않습니다.

그러나 ISO-8859-1은 완전히 합리적이며 8 비트 인코딩을 사용하는 다른 문자 집합에서는 합리적 일 것입니다.
parsifal

4
+1 OP는 ISO 8859-1을 요구하지 않고 US-ASCII 및 UTF- * 만 요구했습니다.
Ross Patterson

@RossPatterson-사실이지만 OP가 실제로 문제를 생각하지 않았기 때문인 것으로 보입니다. 저를 백업 할 통계가 없다면 무작위 "이 텍스트"알고리즘이 UTF-16보다 ISO-8859-1을 선호 할 가능성이 더 높습니다. 세계의 텍스트.
parsifal

3
@parsifal 모든 바이너리는 유효한 ISO-8859-1이므로 유효하지 않은 ISO-8859-1을 만드는 것이 불가능하기 때문에 단순히 고려할 필요는 없습니다.
Esailija

1
@parsifal true 그리고 그것이 요구 사항이라면 그냥 사용할 수 0x00있거나 무엇이든 할 수 있지만 op는 그것을 원하지 않았습니다.
Esailija

5
  • UTF-8에서 바이트 C0, C1 및 F5-FF는 유효하지 않습니다. 첫 번째 바이트는 ASCII이거나 C2-F4 범위의 바이트 여야합니다. 다른 시작 바이트는 유효한 UTF-8이 아닙니다.

  • UTF-16에서 파일은 일반적으로 바이트 순서 표시 (U + FEFF)로 시작합니다. 그렇지 않으면 응용 프로그램이 바이트 순서를 추측해야합니다. D800-DBFF 범위의 코드 포인트는 서로 게이트 쌍의 리드 바이트이고 DC00-DFFF는 서로 게이트 쌍의 후행 바이트입니다.

따라서 바이트 콤보를 사용합니다 F5DC. 이 두 값은 다음과 같습니다.

  • ASCII 아님
  • 유효하지 않은 UTF-8
  • 대리 쌍 (법적 아님)의 UTF-16 후행 바이트 또는 개인용 문자 인 코드 포인트 U + F5DC 로 해석되지만 BOM이 없어도 UTF-16으로 완고하게 해석하려는 응용 프로그램 에서만 해석됩니다. .

당신이 필요로하는 경우 더 많은 옵션을, F5DD에 이르기까지 F5DF모든는 않습니다 같은 3 개 속성이 F6DC- F6DF, F7DC- F7DFF8DC- F8DF, 16 개의 다른 바이트 콤보의 총에서 선택 할 수 있습니다.


따라서 Esailija의 U + DCDC 사용 제안따르면0xDC 유효한 UTF-8이 되겠습니까?
Daniel AA Pelsmaeker

2
@Virtlink 0xDC는 2 바이트 시퀀스의 UTF-8 리드 바이트입니다. 10xxxxxx유효하려면 연속 바이트 가 뒤에 와야 합니다. 0xDC유효한 연속 바이트 0xDC 0xDC가 아니므로 유효한 UTF-8이 아닙니다.
Esailija

@Virtlink : 아니요. 두 번째 바이트가 유효하지 않기 때문에 80- 범위에 있어야합니다 BF.
Martijn Pieters

2

인쇄 할 수없는 문자를 사용하여 "텍스트가 아님"을 나타내려고하면 0x89를이기는 것이 어려울 것입니다.

  • US-ASCII 범위를 벗어났습니다.
  • ISO-8859-1에서 인쇄 할 수없는 문자입니다 ( "문자 기호로 판단"). Shift-JIS와 마찬가지로 여전히 보편적으로 사용되고 있다고 생각합니다. 그러나 다른 8 비트 인코딩은이를 유효한 문자로 취급 할 수 있습니다.
  • UTF-8에서는 멀티 바이트 시퀀스에 대해 유효하지 않은 첫 번째 바이트입니다 (맨 위 비트는 10이며 멀티 바이트 시퀀스의 문자 2..N에 예약 됨)

일반적으로 마법의 숫자를 형성 할 때 "텍스트가 아닌"은 작은 부분입니다. 참조를 찾아봐야하지만 표준 그래픽 형식 (TIFF, 생각) 중 하나는 마법 번호에서 유용한 정보의 6 가지 조각과 같은 것이 있습니다.

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