2011-01-19 9 views
2

대용량 (약 기가 바이트)의 플랫 파일 데이터베이스를 디코딩했는데, 문자 인코딩을 전혀 사용하지 않았습니다. 파이썬 모듈 chardet는 인코딩을 식별하는, 지금까지 좋은 일을하지만, 장애물에 충돌하면 ...Chardet이 Big5에서 틀린 것 같습니다.

In [428]: badish[-3] 
Out[428]: '\t\t\t"Kuzey r\xfczgari" (2007) {(#1.2)} [Kaz\xc4\xb1m]\n' 

In [429]: chardet.detect(badish[-3]) 
Out[429]: {'confidence': 0.98999999999999999, 'encoding': 'Big5'} 

In [430]: unicode(badish[-3], 'Big5') 
--------------------------------------------------------------------------- 
UnicodeDecodeError      Traceback (most recent call last) 

~/src/imdb/<ipython console> in <module>() 

UnicodeDecodeError: 'big5' codec can't decode bytes in position 11-12: illegal multibyte sequence 

chardet는 매우 높은 자신감을 인코딩의 선택입니다보고하지만 '아무튼 디코딩 ... 다른 현명한 접근법이 있습니까?

+1

해킹의 약간, 특히 따옴표로 표시된 부분에서만 탐지를 시도하면 매우 낮은 신뢰도로 실제로 전체 라인을 디코딩하는 인코딩 (ISO-8859-2)이 반환됩니다. 나는 일반화를 찾고 있지만 전체 데이터베이스에 적용 할 수 있습니다. – SingleNegationElimination

답변

3

너무 강하게 강조 할 수없는 지점 : 너무 짧고 텍스트에 평범한 오래된 ASCII 문자가 많이 포함되어있어 합당한 인코딩 추측은 기대할 수 없습니다.

big5 정보 : chardet은 CJK 인코딩을 확인할 때 매우 넓은 네트를 캐스팅합니다. big5에는 사용하지 않은 슬롯이 많이 있으며, chardet은 그들을 제외하지 않습니다. 그 문자열은 당신이 알아 낸 것처럼 big5가 유효하지 않습니다. 사실 big5_hkscs (big5_hkscs는 big5에서 많은 구멍을 사용했습니다)는 유효하지만 (의미가 없습니다.)

문자열에 적합한 단일 바이트 인코딩이 많습니다.

이 단계에서는 대역 외 도움말을 찾아야합니다. 우리가 지금 언어를 가지고있을 정도로 "Kuzey etc"를 검색하는 것은 터키의 TV 시리즈 "Kuzey rüzgari"를 끌어 올린다.

즉, 터키어로 유명한 사람이 입력 한 경우 cp1254 또는 iso_8859_3 (또는 _9) 또는 mac_turkish에있을 수 있습니다. 모든 이들이 끝 근처에 [Kaz ?? m] 단어에 대해 횡설수설합니다. imdb 웹 사이트에 따르면, 그것은 캐릭터의 이름이며, cp1254와 iso-8859-9 (KazÄ ± m)로 디코딩 한 것과 같은 횡설수설입니다. 당신의 제안 된 iso-8859-2로 디코딩하면 KazÄąm이 그다지 그럴듯 해 보이지 않습니다.

일반화 할 수 있습니까? 나는 그렇게 생각하지 않는다 :-)

나는 latin1을 사용하여 그것을 해독하여 (바이트가 맹 글링되지 않도록), 알 수없는 인코딩으로 레코드에 플래그를 붙일 것을 강력히 제안한다. 최소 길이 절단도 사용해야합니다.

이 the_two_bytes_in_the_character_name.decode, 가치가 무엇인지에 대한 업데이트 ('UTF8')은 터키어 및 아제르바이잔 사용되는 U + 0131 LATIN SMALL LETTER 점이없는 I을 생산하고 있습니다. 더 많은 인터넷 검색 결과는 Kazım이 일반적으로 충분한 터키어 이름임을 나타냅니다.

+0

인코딩이 라인보다 빠른 속도로 변하는 것이 얼마나 실망 스러운지. 이 데이터는 실제로 IMDB에서 온 것입니다 ... – SingleNegationElimination

관련 문제