28

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

BOM (Byte Order Mark)이있을 때 아무런 문제가 없습니다. 나는 파일이 UTF-8 또는 UTF-16 BE인지 또는 LE인지 안다.

파일이 ANSI 인 BOM이 없을 때 가정하고 싶었습니다. 그러나 내가 다루고있는 파일이 종종 BOM이 누락 된 것으로 나타났습니다. 따라서 BOM이 없으면 파일이 ANSI, UTF-8, UTF-16 BE 또는 LE임을 의미 할 수 있습니다.

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

이것을 결정하는 일반적인 알고리즘 방식을 찾고 있습니다. 하지만 실제로는 유니 코드를 알고 있고 TEncoding 클래스를 가지고있는 Delphi 2009를 사용합니다. 따라서 특정 사항은 보너스가됩니다.


대답:

ShreevatsaR의 답변으로 Google에서 "universal encoding detector delphi"를 검색하여 약 45 분 동안 살아남은 후 #1 위치에이 게시물이 올라 있다는 사실에 놀랐습니다! 그건 빠른 googlebotting입니다 !! 또한 Stackoverflow가 매우 빠르게 1 위를 차지한다는 것도 놀라운 사실입니다.

Google의 2 번째 항목은 Fred Eaker의 블로그 항목입니다.문자 인코딩 감지알고리즘을 여러 언어로 나열했습니다.

나는 그 페이지에서 Delphi에 대한 언급을 발견했다.SourceForge에서 무료 OpenSource ChsDet Charset Detector델파이로 작성되었으며 모질라의 i18n 구성 요소를 기반으로합니다.

환상적! 고맙습니다. (모두 +1), 감사합니다 ShreevatsaR, 그리고 Stackoverflow, 1 시간 이내에 내 답을 찾을 수 있도록 도와 주셔서 다시 한번 감사드립니다!


  • 편집 해 주셔서 감사합니다! ChsDet이 작동하는 것 같습니다! - Edwin Yip

4 답변


9

어쩌면 당신은 파이썬 스크립트를 사용할 수 있습니다.Chardet : 범용 인코딩 감지기. Firefox에서 사용하는 문자 인코딩 감지 기능을 다시 구현 한 것으로,다양한 애플리케이션. 유용한 링크:모질라 코드,연구 논문(아이러니하게도, 파이어 폭스는 그 페이지의 인코딩을 정확하게 감지하지 못한다.)간단한 설명,상해.


  • 우. 내가 원하는 알고리즘의 유형과 정확히 일치합니다. 이제 어떻게 작동하는지 알 수 있거나 델파이와 동등한 것을 찾을 수 있다면 ... - lkessler
  • 문서에 따르면 Python의 Mozilla cpp 코드 포트입니다. 후자는mxr.mozilla.org/seamonkey/source/extensions/universalchardet/…육화가 어느 항구로 더 쉽는지는 알 수 없습니다! - Marek Jedliński
  • (계속) CPP 버전이 더 많이 언급되어 포팅에 도움이 될 것 같습니다. - Marek Jedliński
  • 모든 링크가 사망했습니다. 그들을 복구 할 수 있습니까? - Jeroen Wiert Pluimers

5

여기있다.어떻게 메모장 않습니다

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



4

내 생각 엔 :

  • 먼저 파일의 바이트 값이 32보다 작은 지 확인합니다 (탭 / 개행 문자 제외). 이 경우 ANSI 또는 UTF-8이 될 수 없습니다. 따라서 - UTF-16. 엔디안을 알아 내야합니다. 이를 위해서는 유효한 유니 코드 문자 코드 표를 사용해야합니다. 유효하지 않은 코드가있는 경우 다른 엔디안을 사용해보십시오. 어느 쪽이든 맞으면 (또는하지 않는 경우), 어느 것이 더 큰 퍼센트의 영숫자 코드를 가지고 있는지 확인하십시오. 또한 줄 바꿈을 검색하고 그 줄에서 엔딩을 결정할 수도 있습니다. 그 외에는 엔디안을 확인하는 방법에 대한 아이디어가 없습니다.
  • 파일에 공백 문자를 제외하고 32 미만의 값이 포함되어 있지 않으면 ANSI 또는 UTF-8 일 것입니다. UTF-8로 파싱 해보고 유효하지 않은 유니 코드 문자가 있는지 확인하십시오. 그렇게한다면 아마도 ANSI 일 것입니다.
  • 비영어권 단일 바이트 또는 다중 바이트 비 유니 코드 인코딩으로 문서를 기대하는 경우 운이 좋지 않습니다. 당신이 할 수있는 가장 좋은 일은 문자 값의 히스토그램을 만들고 알려진 언어의 히스토그램과 비교하는 Internet Explorer와 같은 것입니다. 그것은 꽤 자주 작동하지만 때때로 너무 실패합니다. 그리고 모든 언어에 대한 문자 히스토그램의 거대한 라이브러리가 있어야합니다.


  • 음, 종종 텍스트 파일에 32보다 작은 값을 가진 바이트를 보았습니다. \ n, \ r, \ t 같은 것들. 드물게 다른 것들도. - Michael Burr
  • ASCII, 대부분의 ANSI 코드 페이지 및 UTF-8은 바이트 값이 32 미만인 캐리지 리턴, 줄 바꿈, 가로 탭, 널 문자 등과 같은 문자를 인식합니다. - Windows programmer
  • 공정한 포인트. 게시물을 수정하겠습니다. - Vilx-
  • 질문에 ASCII가 아닌 ANSI를 말하려고했습니다. 지금 질문을 수정했습니다. 이를 반영하기 위해 답을 수정할 수도 있습니다. - lkessler

1

ASCII? 현대 OS에서는 더 이상 ASCII를 사용하지 않습니다. 그들은 모두 UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS 또는 다른 어떤 것이 든 8 비트 코드를 사용합니다.

내가 아는 유일한 테스트는 잘못된 UTF-8 문자를 확인하는 것입니다. 어떤 것을 발견하면 UTF-8이 될 수 없다는 것을 알게됩니다. 같은 것이 UTF-16에서 가능합니다. 그러나 유니 코드가 설정되어 있지 않으면 어떤 Windows 코드 페이지인지 알기가 어려울 수 있습니다.

대부분의 편집자는 사용자가 가능한 모든 인코딩의 목록에서 기본값을 선택하게하여이 문제를 해결합니다.

UTF 문자의 유효성을 검사하는 코드가 있습니다.


  • 죄송합니다. ASCII가 아니라 ANSI를 사용하고 있습니다. 이를 편집 해 보겠습니다. - lkessler
  • Windows에는 여전히 장치 드라이버가 있습니다. 커널 코드가 7 비트가 깨끗하지 않으면 후회할 것입니다. - Windows programmer
  • @Windows 프로그래머 : 커널 코드가 7 비트 클린이어야한다는 것은 무엇을 의미합니까? 대부분의 (모든?) 드라이버는 유니 코드를 다룰 필요가 있습니다. 때때로 문제가 MBCS에서 유니 코드로 바뀌고 있지만 (OEM이나 기본 코드 페이지를 사용합니까? 등). - Michael Burr
  • 파일 이름을 처리하는 코드는 변수 (PUNICODE 등)의 문자열을 복사하고 변환해야하지만 컴파일 타임에 제대로 컴파일하려면 소스 코드가 여전히 7 비트 여야합니다. - Windows programmer

연결된 질문


관련된 질문

최근 질문