2013-02-22 2 views
2

필자는 텍스트 파일에서 발음 구별 기호를 제거하려고합니다. 필자는 pdf 파일을 도구로 텍스트로 변환했으며, 나 자신이 만들지 않았습니다. 그들이 사용하는 인코딩을 이해할 수 없었습니다. 이 텍스트는 정문으로 스페인어에 익숙한 Nahuatl으로 작성되었습니다.파이썬에서 올바른 인코딩을 찾는 방법은 무엇입니까?

텍스트를 문자열 목록으로 변환했습니다. 아니요. 다음을 시도하고 있습니다.

# check whether there is a not-ascii character in the item 
def is_ascii(word): 
    check = string.ascii_letters + "." 
    if word not in check: 
     return False 
    return True 

# if there is a not ascii-character encode the string 
def to_ascii(word): 
    if is_ascii(word) == False: 
     newWord = word.encode("utf8") 
     return newWord 
    return word 

내가 원하는 것은 내 문자열의 유니 코드 버전입니다. 지금까지는 작동하지 않으며 latin1, cp1252, iso-8859-1과 같은 여러 인코딩을 시도했습니다. 내가 얻은 것은 누군가 내가 잘못한 것을 말해 줄 수 있니?

올바른 인코딩을 어떻게 찾을 수 있습니까?

감사합니다.

편집 : 나는 컨버터 (PDF-TXT)을 개발 사람들에게 쓴 그들은 이미 유니 코드를 사용하고있다. 그래서 John Machin은 (1)을 대답했습니다. 이클립스 디버거에서 목록 자체가 유니 코드의 일부 표시를 표시했기 때문에 나에게 명확하지 않은 일부 의견을 적어 두었습니다. 그리고 항목을 개별적으로 보면 어떤 방식 으로든 모두 디코딩되어 실제로 유니 코드를 보았습니다.

도움 주셔서 감사합니다.

+2

Ned Batchelder의 [Pragmatic Unicode, 또는 어떻게 고통을 멈 춥니 까?] (http://nedbatchelder.com/text/unipain.html)를 참조하십시오. Fact of Life # 4 ("바이트의 인코딩을 추측 할 수 없으며, 반드시 말해야 함, 또는 추측해야 함") 직접 관련이 있지만 나머지도 사용할 수있는 것으로 보입니다. – delnan

+0

문자 빈도 및 조합에 대한 통계 정보를 사용하는 인코딩을 추측하는 라이브러리는 영어와 마찬가지로 Nahuatl에서도 잘 작동하지 않을 수 있습니다. 불행한 사실은 인코딩을 추측하려는 노력의 대부분이 텍스트가 소수의 주요 세계 언어 중 하나에 포함 된 문서에 초점을 맞추고 있다는 것입니다. – BrenBarn

+0

@ user1986412 : 파일을 분석 가능하게 만들 수 있습니까? –

답변

1

질문을 편집하여 사용중인 Python 버전을 표시하십시오. 코드에서 버전을 추측하는 것은 불가능합니다. Python 3.X 또는 2.X를 사용하든간에 많은 문제가 있습니다. 다음 주석은 Python 2.x를 가정합니다.

이미 UTF-8로 인코딩 된 텍스트가있는 것 같습니다. 시도해보십시오 the_text.decode('utf8'). 디코딩하고 인코딩하지 마십시오.

UTF-8로 디코딩해도 UnicodeDecodeError가 발생하지 않고 텍스트가 너무 짧지 않은 경우 UTF-8이 올바른 인코딩과 매우 유사합니다.

위의 방법으로 해결되지 않으면 print repr(the_text)의 결과를 보여주세요.

파일이 ASCII로 인코딩되었는지 여부를 확인하려고 시도하는 것은 비현실적입니다. ASCII는 UTF-8의 하위 집합입니다. 어떤 데이터를 str 개체로 나머지를 unicode으로 남겨두면 파이썬 2.x에서는 엉망이고 파이썬 3.x에서는 작동하지 않을 것입니다.

어쨌든 첫 번째 함수는 생각했던대로 작동하지 않습니다. 길이가 2 이상인 입력. 자 열에 대해서는 False을 리턴합니다. 단위 테스트 기능을 쓸 때 고려해보십시오. 나중에 디버깅이 훨씬 빨라집니다.

latin1iso-8859-1은 동일한 인코딩입니다. latin1은 같은 순서로 유니 코드의 첫 번째 256 코드 포인트를 인코딩하므로 text.decode('latin1')에 의해 생성 된 UnicodeDecodeError을 가져올 수 없습니다. "No error"는 진단 값이 정확히 0 인 경우입니다.

OP에서이 댓글에 응답 업데이트 : 두 가지 방법으로 일어날 수

I use Python 2.7. If I use text.decode("utf8") it raises the following error: UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2014' in position 0: ordinal not in range(256).

:

foo = text.decode('utf8') 같은 단일 성명에서 text 이미 유니 코드 객체 (1)

따라서 Python 2.X는 기본 인코딩 (latin-1 ???)을 사용하여 인코딩하려고합니다.

이 (2) sys.stdout.encoding는 아마도 두 개의 서로 다른 문에서, 첫 번째는 text은 UTF-8로 인코딩 str 목적은 foo = text.decode('utf8') 곳이 문을 print foo 같은 다음 오류를 제기하지 않고있다 latin-1 (???).

내 대답을 "틱"한 이유를 상상할 수 없습니다. 그 질문이 아직 무엇인지는 아무도 모른다.

하십시오 편집 코드 (단지 text.decode("utf8") 줄 앞에 print repr(text)을 삽입), 그리고 실행의 결과를 보여 질문. repr() 결과와 전체 추적을 표시하면 (오류를 일으키는 행을 확인할 수 있습니다).

다시 물어보십시오. 파일을 분석 가능하게 만들 수 있습니까?

그런데 u'\u2014'은 "EM DASH"이며 cp1252의 유효한 문자입니다 (단, 오류 메시지에서 확인한 것처럼 latin-1에는 표시되지 않음). 어떤 운영 체제 버전을 사용하고 있습니까?

그리고 마지막 질문에 대답하기 위해 알려진 우주의 모든 코덱을 사용하여 텍스트를 디코딩하지 마십시오. 당신은 이미 그럴듯한 유니 코드를 얻고 있습니다. 뭔가 (귀하의 코드?) 어떤 식 으로든 뭔가를 해독하고 있습니다 - u'\u2014'의 존재는 그 증거입니다. 코드와 그 결과를 보여주세요.

+0

아니요, 불행히도 아직 인코딩을 알아 내지 못했습니다. 나는 파이썬 2.7을 사용한다. 텍스트를 사용하는 경우.decode ("utf8")하면 다음 오류가 발생합니다. UnicodeEncodeError : 'latin-1'코덱은 U '\ u2014'위치를 0으로 인코딩 할 수 없습니다. 서수는 범위 (256)에 없습니다. 자, 그럼 utf8이 아닌 것 같습니다. 모든 인코딩을 무작위로 검사해야합니까? 이 목록에있는 것처럼 http://docs.python.org/2/library/codecs.html – Rattlesnake

1

일부 바이트를 읽고 unicode 문자열로 해석하려는 경우 encode() 대신 .decode()을 사용해야합니다.

@delnan이 댓글에서 말한 것처럼, 나는 당신이 인코딩을 알고 있기를 바랍니다. 그렇지 않다면 추측은 사용 된 기능을 고치면 쉽게 될 것입니다.

왜 그런 단어에 ASCII 문자 만있는 경우에도 .decode()도 없습니까? 어디서나 같은 데이터 유형 (unicode)을 사용하면 프로그램을 더 간단하게 만들 수 있습니다.

+0

나를 그렇게 혼란스럽게 만드는 것은 단어로 단어를 나눠서 목록에 저장한다는 것입니다. 그리고이 목록 안에는 UTF-8 인 것 같습니다. 예 : 단어는 다음과 같이 저장됩니다. est \\ xc3 \\ xa1n 그러나 목록을 반복하여 단어로 작업하면 항목이 다음과 같이 표시됩니다. "str : están" – Rattlesnake

+0

왜 그 점이 놀랍습니까? UTF-8 문자열을 처리하는 것과 일치하는 한'str' 변수에 UTF-8 문자열을 유지하는 데는 아무런 문제가 없습니다. 내장 된'unicode' 타입을 사용하면 처리가 쉬워집니다. – Kos

관련 문제