BOM (바이트 주문 마크)이 누락 될 때 인코딩을 가장 잘 추측 할 수있는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/373081

문제

내 프로그램은 다양한 인코딩을 사용하는 파일을 읽어야합니다. 이들은 ANSI, UTF-8 또는 UTF-16 (크거나 작은 엔디 언) 일 수 있습니다.

BOM (바이트 주문 마크)이 있으면 아무런 문제가 없습니다. 파일이 UTF-8 또는 UTF-16 BE인지 또는 LE인지 알고 있습니다.

파일이 ANSI라는 사실이 없을 때 가정하고 싶었습니다. 그러나 나는 내가 다루고있는 파일이 종종 그들의 BOM을 놓치고 있음을 발견했습니다. 따라서 BOM은 파일이 ANSI, UTF-8, UTF-16 BE 또는 LE임을 의미 할 수 없습니다.

파일에 BOM이없는 경우 파일 중 일부를 스캔하고 인코딩 유형을 가장 정확하게 추측하는 가장 좋은 방법은 무엇입니까? 파일이 ANSI이고 UTF 형식이라면 파일이 90 년대 인 경우 시간의 100%에 가까워지고 싶습니다.

나는 이것을 결정하는 일반적인 알고리즘 방법을 찾고 있습니다. 그러나 나는 실제로 유니 코드를 알고 Tencoding 클래스를 가지고있는 Delphi 2009를 실제로 사용하므로 그와 관련된 것이 보너스가 될 것입니다.


대답:

Shreevatsar의 답변은 Google에서 "Universal Encoding Detector Delphi"를 검색하게 만들었습니다. 그것은 빠른 GoogleBotting입니다 !! 또한 StackoverFlow가 너무 빨리 1 위를 차지한다는 것이 놀랍습니다.

Google의 두 번째 항목은 Fred Eaker의 블로그 항목이었습니다. 문자 인코딩 탐지 다양한 언어로 알고리즘을 나열했습니다.

나는 그 페이지에서 델파이에 대한 언급을 발견했고, 그것은 나를 곧바로 이끌었다 Sourceforge의 무료 OpenSource Chsdet Charset Detector Delphi로 작성되었으며 Mozilla의 I18N 구성 요소를 기반으로합니다.

환상적인! 답변 해 주신 모든 분들께 감사드립니다 (모두 +1), Shreevatsar에게 감사 드리며 한 시간 이내에 답을 찾도록 도와 주셔서 감사합니다.

도움이 되었습니까?

해결책

어쩌면 당신은 사용하는 파이썬 스크립트로 껍질을 벗길 수 있습니다. Chardet : 범용 인코딩 검출기. Firefox에서 사용하는 캐릭터 인코딩 탐지의 상환이며 많은 다른 응용 프로그램. 유용한 링크: 모질라의 코드, 연구 논문 (아이러니하게도 내 파이어 폭스는 해당 페이지의 인코딩을 올바르게 감지하지 못), 짧은 설명, 상해.

다른 팁

여기에 있습니다 메모장이 그렇게하는 방법

또한 있습니다 파이썬 범용 인코딩 검출기 확인할 수 있습니다.

내 생각은 :

  • 먼저 파일에 바이트 값이 32 미만인 지 확인하십시오 (탭/Newlines 제외). 그렇다면 ANSI 또는 UTF-8이 될 수 없습니다. 따라서 -UTF -16. 엔지니어를 파악해야합니다. 이를 위해서는 유효한 유니 코드 문자 코드의 일부 테이블을 사용해야합니다. 유효하지 않은 코드가 발생하면 다른 엔디 니스가 맞으면 시도하십시오. 맞는 경우 (또는 그렇지 않음), 어느 것이 영숫자 코드의 비율이 더 큰지 확인하십시오. 또한 당신은 선을 벗기고 Searchung을 시도하고 그들로부터의 엔지니어를 결정할 수 있습니다. 그 외에는 엔디 니언을 확인하는 방법이 없습니다.
  • 파일에 32 세 미만의 값이없는 경우 (상기 공백을 제외하고) 아마도 ANSI 또는 UTF-8 일 것입니다. UTF-8로 구문 분석하고 유효하지 않은 유니 코드 문자를 얻는 지 확인하십시오. 그렇게한다면 아마도 ANSI 일 것입니다.
  • 영어 이외의 단일 바이트 또는 다중 바이트 비 유니 코드 인코딩의 문서를 예상하면 운이 좋지 않습니다. 당신이 할 수있는 가장 좋은 방법은 Internet Explorer와 같은 것이 문자 값의 히스토그램을 만들고 알려진 언어의 히스토그램과 비교하는 것입니다. 그것은 꽤 자주 작동하지만 때로는 실패합니다. 그리고 모든 언어에 대해 큰 문자 히스토그램 라이브러리가 있어야합니다.

ASCII? 최신 OS는 더 이상 ASCII를 사용하지 않습니다. 그들은 모두 8 개의 비트 코드를 사용합니다. 적어도 UTF-8, Irlatinx, Winlatinx, MacRoman, Shift-JIS 또는 그 밖의 다른 것임을 의미합니다.

내가 아는 유일한 테스트는 유효하지 않은 UTF-8 숯을 확인하는 것입니다. 당신이 찾을 수 있다면, 당신은 그것이 UTF-8 일 수 없다는 것을 알고 있습니다. UTF-16에서도 마찬가지입니다. 그러나 유니 코드 세트가 없으면 어떤 Windows 코드 페이지인지 알기가 어려울 것입니다.

내가 아는 대부분의 편집자는 사용자가 가능한 모든 인코딩 목록에서 기본값을 선택할 수있게함으로써이를 처리합니다.

UTF 숯의 유효성을 확인하기위한 코드가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top