파일 인코딩을 감지하는 방법?


115

내 파일 시스템 (Windows 7)에 텍스트 파일이 있습니다 (중요한 경우 SQL 스크립트 파일입니다).

Notepad ++로 열면 "인코딩"메뉴에서 일부는 "UCS-2 Little Endian"으로 인코딩되고 일부는 "UTF-8없는 BOM"으로 인코딩됩니다.

차이점은 무엇입니까? 그것들은 모두 완벽하게 유효한 스크립트 인 것 같습니다. 메모장 ++없이 파일에 어떤 인코딩이 있는지 어떻게 알 수 있습니까?


7
Firefox를 사용하는 아주 간단한 방법이 있습니다. Firefox를 사용하여 파일을 연 다음보기> 문자 인코딩을 사용하십시오. 여기에 자세히 설명되어 있습니다 .
Catherine Gasnier

휴리스틱을 사용하십시오. 체크 아웃 encachardetPOSIX 시스템.
Janus Troelsen '11

3
다른 대답은 TRIAL과 ERROR라고 생각합니다. iconv특히이 목적에 유용합니다. 본질적으로 다른 인코딩을 통해 손상된 문자 문자열 / 텍스트를 반복하여 어떤 인코딩이 작동하는지 확인하십시오. 캐릭터가 더 이상 손상되지 않으면 승리합니다. 프로그래밍 방식으로 여기에 대답하고 싶습니다. 그러나 불행히도 보호되는 질문입니다.
Brandon Bertelsen

FF는 Mozilla Charset Detectors를 사용하고 있습니다. 또 다른 간단한 방법은 MS 워드로 파일을 여는, 심지어는 다양한 고대 중국과 일본의 코드 페이지에 대한 아주 정확하게 파일을 추측합니다
phuclv

경우 chardet또는 chardetect(예를 들어, 사용자의 시스템에서 사용할 수 없습니다, 당신은 패키지 관리자를 통해 패키지를 설치할 수 있습니다 apt search chardet- 패키지가 보통이라고 우분투 / 데비안 python-chardet또는 python3-chardet) 또는 통해 PIPpip install chardet(또는 pip install cchardet빠른 C에 최적화 된 버전).
ccpizza

답변:


97

파일은 일반적으로 파일 헤더로 인코딩을 나타냅니다. 여기에 많은 예가 있습니다 . 그러나 헤더 읽더라도 파일이 실제로 어떤 인코딩을 사용하고 있는지 확신 할 수는 없습니다 .

예를 들어, 처음 3 바이트의 파일 0xEF,0xBB,0xBF아마도 UTF-8로 인코딩 된 파일 일 것입니다. 그러나 문자로 시작하는 ISO-8859-1 파일 일 수 있습니다. 또는 완전히 다른 파일 형식 일 수 있습니다.

Notepad ++는 파일이 어떤 인코딩을 사용하는지, 그리고 대부분의 경우 파일을 올바르게 추측하는 데 최선을 다합니다. 때때로 그것은 잘못되지만- 'Encoding'메뉴가있는 이유이므로 최선의 추측을 무시할 수 있습니다.

언급 한 두 가지 인코딩의 경우 :

  • 은 "UCS-2 리틀 엔디안"파일 (I는 정보에서 이해 내용에 따라 UTF-16 파일입니다 여기에 그래서) 아마 시작 0xFF,0xFE으로 처음 2 바이트. 내가 알 수있는 것으로부터, Notepad ++는 UTF-16의 특정 측면을 지원하지 않기 때문에 "UCS-2"로 설명합니다.
  • "BOM없는 UTF-8"파일에는 헤더 바이트가 없습니다. 이것이 "BOM없이"비트의 의미입니다.


2
BOM으로 시작하는 파일이 "UTF없는 BOM"으로 자동 감지되는 이유는 무엇입니까?
Michael Borgwardt

2
파일이 0xFF, 0xFE로 시작하면 UCS-2가 아닌 UTF-16으로 자동 감지되어야합니다. UCS-2는 주로 ASCII 문자를 포함하므로 다른 모든 바이트가 널이므로 추측됩니다.
Michael Borgwardt

2
경험상 슬프게도 메타 데이터 ( "헤더")도 틀릴 수 있습니다. 정보를 보유한 데이터베이스가 손상되었거나 원래 업 로더가이 정보를 잘못 받았을 수 있습니다. (이것은 지난 몇 개월 동안 우리에게 중요한 문제였습니다. 일부 데이터는“정말 ISO8859-1인데, 실제로는 동일하기 때문에?”)를 제외하고는“UTF-8”로 업로드되었습니다. 메타 데이터의
지지만

1
실제로 나는 세계에서 어떤 파일도 ""로 시작하지 않기 때문에 인코딩 문제가 2014 년에도 여전히 "재미있다"고 생각하며 잘못된 인코딩으로로드 된 HTML 페이지를 볼 때 매우 놀랐습니다. 가능성의 문제입니다. 다른 인코딩이 이상한 문자를 피한다면 잘못된 인코딩을 선택하는 것은 생각할 수 없습니다. 이상한 문자를 피하는 인코딩을 찾는 것은 99,9999 %의 경우에 효과가 있다고 생각합니다. 그러나 여전히 오류가 있습니다. 또한 공간을 절약하기 위해 UTF8 대신 ascii를 사용하는 것은 매우 혼란스러운 메시지입니다. 주니어 개발자
들이이

18

당신은 할 수 없습니다. 그렇게 할 수 있다면“무작위 횡설수설”이있는 웹 사이트 나 텍스트 파일이 많지 않을 것입니다. 그래서 인코딩은 일반적으로 페이로드와 함께 메타 데이터로 전송됩니다.

그렇지 않은 경우 "스마트 추측"만 할 수 있지만 동일한 바이트 시퀀스가 ​​여러 인코딩에서 유효하기 때문에 결과가 모호 할 수 있습니다.


2
그렇다면 Windows OS는 해당 정보 (메타 데이터)를 실제로 어딘가에 저장합니까? 레지스트리에서?
Marcel

네가 틀렸어. 코드 페이지는 동일하지 않습니다. 유니 코드 인코딩을 추측하는 알고리즘이 있습니다.
DeadMG

6
@Marcel : 아니요. 이것이 바로 "텍스트 파일"이 순수한 ASCII를 제외하고는 문제가되는 이유입니다.
Michael Borgwardt

노트 패드 패드 ++는 이것을 할 수있다. 텍스트 파일이 utf-8로 인코딩되어 있는지 아닌지를 알려줄 수있다
user25
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.