2010-02-23 8 views
2

저는 C++ 백엔드 (http://www.statmt.org/moses/?n=Development.GetStarted)를 사용하고 C++ 엔진을 구동하는 haiti (code.google.com/p/ccmts) 용 통계 변환 시스템에서 작업 해 왔습니다./백엔드.UTF-8 인코딩 오류가 발생했습니다. 텍스트 변환에 도움이 필요합니다.

mwen :

내가 여기하는 C++ std::string로 UTF-8 파이썬 문자열을 전달 일부 처리를 수행,받은 결과를 다시 파이썬으로하고 한

는 (리눅스 터미널에 C++에서 인쇄) 문자열입니다 약도

  1. 인코딩은 무엇입니까? 이중 인코딩 된 문자열입니까?
  2. 렌더링 할 수 있도록 어떻게 수정해야합니까?
  3. 글꼴이 없기 때문에 그 방식으로 인쇄됩니까? 나는 문자열/유니 코드/코덱의 디코딩이 나에게 오래된 제공 실행할 때, 파이썬,

    {'confidence': 0.93812499999999999, 'encoding': 'utf-8'} 
    

    을하지만 :

파이썬 chardet 라이브러리는 말한다

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 30: ordinal not in range(128)

아, 그리고 파이썬 인쇄하는 동일한 정확한 문자열을 표준 출력으로 출력합니다.

repr() 전화를 인쇄 다음은 : 당신의 default encoding이 ASCII처럼 'mwen bezwen \ XC3 \ xa3 \ XC2 \ xa8 D MEDIKAL'

+1

특정 인코딩을 결정하는 데 도움이된다고 생각합니다. 문자열은 파이썬에서 반환되는 repr()이 무엇인지 알려주는 것입니다. – Jorenko

+0

repr() 출력 : 'mwen bezwen \ xc3 \ xa3 \ xc2 \ xa8 d medikal' –

+0

예상 결과가 무엇인지 알고 있으면 도움이됩니다. . 가 UnicodeDecodeError가 : 'ASCII'코덱 위치 13 바이트 0xc3을 디코딩 할 수 있어야했다 –

답변

3

쓰레기통, 쓰레기통 같은데. 다음은 데이터에서 얻은 것을 확인하는 방법에 대한 몇 가지 단서입니다. repr()unicodedata.name()은 친구입니다.

>>> s = ' mwen bezwen \xc3\xa3 \xc2\xa8 d medikal ' 
>>> print repr(s.decode('utf8')) 
u' mwen bezwen \xe3 \xa8 d medikal ' 
>>> import unicodedata 
>>> unicodedata.name(u'\xe3') 
'LATIN SMALL LETTER A WITH TILDE' 
>>> unicodedata.name(u'\xa8') 
'DIAERESIS' 
>>> 

업데이트 :

하는 경우 (같은 A.의 N.다른 의미는 패키지가 출력 언어를 무작위로 선택하게하고 그 선택이 의심 스럽다고 생각합니다. 한국의 (a)는 여기에 .... 우리의 (b) 해당 언어 관련이 코덱을 사용하여 출력을 디코딩하려고 말해 한국뿐 아니라 두 개의 중국, 일본의 각, 러시아어 없습니다 :

>>> s = ' mwen bezwen \xc3\xa3 \xc2\xa8 d medikal ' 
>>> for enc in 'euc-kr big5 gb2312 shift-jis euc-jp cp1251 koi8-r'.split(): 
    print enc, s.decode(enc) 


euc-kr mwen bezwen 찾 짢 d medikal 
big5 mwen bezwen 瓊 穡 d medikal 
gb2312 mwen bezwen 茫 篓 d medikal 
shift-jis mwen bezwen テ」 ツィ d medikal 
euc-jp mwen bezwen 達 即 d medikal 
cp1251 mwen bezwen ГЈ ВЁ d medikal 
koi8-r mwen bezwen цё б╗ d medikal 
>>> 

매우 그럴듯한 것은 없습니다. 정말로, 특히 koi8-r. 추가 제안 : 인터페이스 패키지의 문서를 검사하십시오 (URL 제발!) ... 인코딩에 대해 무엇을 말합니까? 두 언어 중 어느 것을 시도하고 있습니까? "mwen bezwen"은 예상되는 출력 언어에서 의미가 있습니까? 훨씬 더 큰 텍스트 샘플을 시도해보십시오 - Chardet은 여전히 ​​UTF-8을 나타 냅니까? 더 큰 출력물이 예상되는 출력 언어에서 의미가 있습니까? ASCII 만 사용하는 다른 언어로 영어를 번역 해보십시오. 의미있는 ASCII 출력을 얻을 수 있습니까? 파이썬 코드와 swig 인터페이스 코드를 알려주시겠습니까?

업데이트 2 정보 흐름이 재미있다 : "문자열 처리 응용 프로그램"-> "통계 번역 시스템"- 아이티 도울> "기계 번역 시스템 (오픈 소스/자유 소프트웨어) (crisiscommons.org
: 모두 Google Translate (alpha)Microsoft Translate (beta)에서 얻은

Input language: English (guess) 
Output language: Haitian Creole 
Operating system: linux 
Python version: unknown 
C++ package name: unknown 
C++ package URL: unknown 
C++ package output encoding: unknown 

Test 1 input: unknown 
Test 1 expected output: unknown 
Test 1 actual output (utf8): ' mwen bezwen \xc3\xa3 \xc2\xa8 d medikal ' 
[Are all of those internal spaces really in the string?] 

Test 2 input: 'I need medical aid.' 
Test 2 expected output (utf8): 'Mwen bezwen \xc3\xa8d medikal.' 
Test 2 actual output (utf8): unknown 

시험 2) 다음에 사실로 "알 수없는"

교체 시도하십시오 ".
세 번째 단어는 GRAVE (U + 00E8) 다음에 'd'가있는 라틴 소문자 E입니다.

업데이트 3

당신은 ""말했다 :

는 가정 "" "입력 UTF8은 (어쩌면, 난 내 파일의 몇 가지 잘못 그들에 텍스트를 코드화 된 것 같아)"(당신이했습니다 언급 결코이 명시 적으로) 모든 파일을 UTF-8로 인코딩되어야한다 :

정렬 EN-FR-HT 영장의 zip 파일이 하나가 UTF-8로 디코딩을 시도 충돌 몇 가지 파일이 있습니다.

이런 일이 발생하는 이유

진단 :

chardet는 쓸모가 (이 경우); 그것은 오랫동안 약 faffs 및 80-90 pct의 신뢰 수준으로 ISO-8859-2 (동유럽 일명 Latin2)의 추측으로 돌아옵니다.

다음 단계 : ht-en 디렉토리를 선택하십시오 (ht는 fr보다 강조된 문자를 사용하므로 어떤 일이 일어나는지 쉽게 알 수 있습니다).

기대 : e-grave는 추정 된 ht 텍스트 (웹 사이트, CMU 파일)의 가장 빈번한 비 ASCII 문자입니다. 다음 번 O-grave의 약 3 배입니다. 세 번째로 빈번한 노이즈는 소음에서 사라집니다.

파일 hten.txt의 비 ASCII 바이트가 포함됩니다.5 위 :

최초의 2 행은 라틴 포함하거나 CP1252는 (물을 보유하지 않는

e-grave is 8a in old Western Europe DOS encodings like cp850!! 
o-grave is 95 in old Western Europe DOS encodings like cp850!! 
99164 approx == 3 * 27682 

설명에 의해 설명되는 마지막 세 행이

e-grave is c3 a8 in UTF-8 
o-grave is c3 b2 in UTF-8 
2159 + 6004 approx == 8210 
6004 approx == 3 * 2159 

에 의해 설명된다

8a 99164 
95 27682 
c3 8210 
a8 6004 
b2 2159 

8a는 latin1의 제어 문자이고 8a는 cp1252의 S-caron입니다.

내용을 살펴보면 파일이 여러 원본 파일, 일부 UTF-8, 하나 이상의 cp850 (또는 이와 유사한 파일)의 집계임을 알 수 있습니다. 범인은 성경 인 것처럼 보입니다 !!!

인코딩의 혼합은 왜 Chardet이 고투하는지 설명합니다.

제안 :

(1) 모든 입력 파일에 인코딩 검사 구현. 국경 통제와 같이 UTF-8로 바로 변환해야합니다.

(2) 릴리스 전에 UTF-8 디코딩 가능성을 확인하는 스크립트를 구현하십시오.

(3) 성경 본문의 정형어가 웹 사이트와 다른 것으로 보입니다 (더 많은 아포스트로피). 당신은 당신의 코퍼스가 다른 철자법에 의해 왜곡되고 있는지를 당신의 크리올 전문가들과 토론하기를 원할지도 모릅니다. 누룩을 넣지 않은 빵과 굵은 베를 많이 사용하기를 기대하십니까 & 유골? 참고 cp850 물건은 약 90 %의 집적에 나타납니다. 어떤 성경은 괜찮을 지 모르지만 90 %는 정상에있는 것처럼 보입니다.

(4) Moses가 비 UTF-8 입력에 대해 불평하지 않는 이유는 무엇입니까? 가능성 : (1) 원시 바이트로 작업하고 있습니다. 즉, 유니 코드로 변환하지 않습니다. (2) 유니 코드로 변환하려고 시도하지만 자동으로 오류를 무시합니다 .- (

+0

Ruassian이기 때문에, 실제로 koi8-r은 꽤 재미 있다고 말할 수 있습니다. "цё"는 일종의 ("da"(속어 "the")), "б╗"에 대해서는 "б╗"로 시작하는 매우 음란 한 단어입니다. (그래서, "б ... unprintable"로 읽습니다.)))) 그러나 모든 것은 여전히 ​​정신이 없습니다. – mlvljr

+1

저는 하이티 (crisiscommons.org)에서 도움을주기 위해 기계 번역 시스템 (opensource/freesoftware)을 만들고 있습니다. - 어쩔 수없이, 나는 원어민이 아니기 때문에 엉뚱한 행동을하는 2 명의 캐릭터가 프랑스어로 악센트를 받았다고 확신합니다. 해당 문자셋을 처리하는 방법에 대한 조언을 chars? –

+0

@ct : "http://traduiapp.com/"? 오픈 소스 인 경우 문제를 일으키는 소스 파트를 가리킬 수 있습니까? – mlvljr

1

보인다.

당신은 명시 적으로 귀하의 유니 코드 문자열로 변환 할 수 있습니다 : 당신이 UTF-8로 인코딩하는 래퍼 sys.stdout를, 스크립트에서 전 세계적으로 변경할 교체하려는 경우,

print u"Hellö, Wörld".encode("utf-8") 

을 또는 :

import sys, codecs 
sys.stdout = codecs.EncodedFile(sys.stdout, "utf-8") 
print u"Hellö, Wörld!" 

sys.setdefaultencoding을 통해 기본 인코딩을 한 번 (모든 사이트 전체) 변경할 수 있지만 sitecustomize.py에서만 가능합니다. 나는 이것을 보이지는 않을지 모르지만 - 시스템의 모든 파이썬 스크립트에 영향을 미치고 의도하지 않은 부작용이있을 수 있습니다.

+0

I 여전히 점점 해요 £ bezwen mwen '에 대한 범위 (128) 하지 서수 D MEDIKAL ' 와우 이건 짜증나! –

+0

실제로 'mwen bezwen à £ ¨ d medikal'이 실제로 있어야하고, 결과 Unicode 문자열의 'repr'을 게시 한 경우 (올바른지 확인하기 위해) – oefe

+0

repr() 출력 : 'mwen bezwen \ xc3 \ xa3 \ xc2 \ xa8 d medikal ' –

1

편집 : 내가 전에 게시 한 쓰레기는 신경 쓰지 마라. 이건 잘못 됐어. 정말 당신이 쓰레기를 제공하는 라이브러리의 경우 것으로 보인다

>>> ' mwen bezwen \xc3\xa3 \xc2\xa8 d medikal '.decode('utf-8') 
u' mwen bezwen \xe3 \xa8 d medikal ' 
>>> print _ 
mwen bezwen ã ¨ d medikal 

: 다른 제안으로

,이 UTF-8로 의미 사용자들은 가정, 당신에게 파이썬에서 올바른 유니 코드 개체를 얻을 것이다 쓰레기 여부에 상관없이.

+0

>>> guff = '\ xc3 \ xa3 \ xc2 \ xa8' >>> guff.decode ('utf-16be') 인쇄 쎣son 가능하면 각 유니 코드 문자가 ASCII로 인코딩됩니다. 그렇지 않으면 UTF-16BE ? 믿기 ​​어려운 비트! –

+0

오, 신경 쓰지 마라, 내가 뭘 잘못했는지 알 겠어. 유니 코드 문자는 인코딩 바이트의 연결이 아니라 비 제어 비트이다. 이 문제를 해결하기 위해 두 예제 모두 동일합니다. – Jorenko

+0

& @ 존 Machin : 그래서 당신의 추천은 무엇입니까? 나는 약간 혼란 스럽다. –

관련 문제