Python 유니 코드 인코딩 오류


104

Amazon XML 파일을 읽고 구문 분석 중이며 XML 파일에 '가 표시되는 동안 인쇄하려고하면 다음 오류가 발생합니다.

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

지금까지 온라인에서 읽은 내용에서 오류는 XML 파일이 UTF-8로되어 있지만 Python은이를 ASCII 인코딩 문자로 처리하려고합니다. 오류를 없애고 프로그램이 읽는대로 XML을 인쇄하도록하는 간단한 방법이 있습니까?


나는이 질문을 게시하기 위해 그렇게오고 있었다. 문자열을 살균하는 쉬운 방법이 unicode()있습니까?
Nick Heiner

관련 질문에 대한 답변 도 확인하십시오 .“Python UnicodeDecodeError-인코딩을 잘못 이해하고 있습니까?”
tzot 2010

답변:


193

아마도 문제는 당신이 그것을 잘 파싱했고 이제 당신은 XML의 내용을 인쇄하려고하는데 외국 유니 코드 문자가 있기 때문에 인쇄 할 수 없다는 것입니다. 먼저 유니 코드 문자열을 ascii로 인코딩하십시오.

unicodeData.encode('ascii', 'ignore')

'ignore'부분은 해당 문자를 건너 뛰도록 지시합니다. 파이썬 문서에서 :

>>> u = unichr(40960) + u'abcd' + unichr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'&#40960;abcd&#1972;'

http://www.joelonsoftware.com/articles/Unicode.html 이 기사를 읽고 싶을 수 있습니다.이 기사 는 진행 상황에 대한 기본 자습서로 매우 유용하다고 생각했습니다. 읽은 후에는 어떤 명령을 사용할지 (또는 적어도 나에게 일어난 일) 추측하는 것처럼 느껴지지 않을 것입니다.


1
다음 문자열을 안전하게 만들려고합니다. 'foo "bar bar"df'(곱슬 따옴표 참고), 위의 내용은 여전히 ​​실패합니다.
Nick Heiner

@Rosarch : 어떻게 실패합니까? 같은 오류? 그리고 어떤 오류 처리 규칙을 사용 했습니까?
Scott Stafford

@Rosarch, 귀하의 문제는 아마도 더 이른 것입니다. 다음 코드를 시도해보세요. #-- coding : latin-1-- u = u 'foo "bar bar"df'print u.encode ( 'ascii', 'ignore') 당신을 위해 아마도 당신의 문자열을 주어진 유니 코드로 변환했을 것입니다 오류를 일으킨 파이썬 스크립트에 대해 지정한 인코딩.
Scott Stafford

나는 계속해서 내 문제를 자체 질문으로 만들었습니다. stackoverflow.com/questions/3224427/…
Nick Heiner

1
.encode('ascii', 'ignore')OP의 환경이 비 ASCII 문자를 지원하더라도 불필요하게 데이터 손실 (대부분의 경우)
jfs

16

더 나은 솔루션 :

if type(value) == str:
    # Ignore errors even if the string is not proper UTF-8 or has
    # broken marker bytes.
    # Python built-in function unicode() can do this.
    value = unicode(value, "utf-8", errors="ignore")
else:
    # Assume the value object has proper __unicode__() method
    value = unicode(value)

이유에 대해 자세히 알아 보려면 :

http://docs.plone.org/manage/troubleshooting/unicode.html#id1


3
OP 문제에는 도움이되지 않습니다 : "ca n't encode character u '\ u2019'" . u'\u2019이미 유니 코드입니다.
jfs

6

스크립트 내에서 환경의 문자 인코딩을 하드 코딩하지 마십시오. 대신 유니 코드 텍스트를 직접 인쇄합니다.

assert isinstance(text, unicode) # or str on Python 3
print(text)

출력이 파일 (또는 파이프)로 리디렉션되는 경우 PYTHONIOENCODINGenvvar를 사용하여 문자 인코딩을 지정할 수 있습니다 .

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8

그렇지 않으면, python your_script.py같은 작업을해야하는 것입니다 - 로케일 설정은 텍스트를 인코딩하는 데 사용된다 (POSIX 검사에 : LC_ALL, LC_CTYPE, LANGenvvars - 설정 LANG수정 UTF-8 로케일에 필요한 경우).

Windows에서 유니 코드를 인쇄하려면 Windows 콘솔, 파일 또는 IDLE을 사용하여 유니 코드를 인쇄하는 방법을 보여주는이 답변을 참조하십시오 .


1

우수 게시물 : http://www.carlosble.com/2010/12/understanding-python-and-unicode/

# -*- coding: utf-8 -*-

def __if_number_get_string(number):
    converted_str = number
    if isinstance(number, int) or \
            isinstance(number, float):
        converted_str = str(number)
    return converted_str


def get_unicode(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode
    return unicode(strOrUnicode, encoding, errors='ignore')


def get_string(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode.encode(encoding)
    return strOrUnicode

0

다음과 같은 형식을 사용할 수 있습니다.

s.decode('utf-8')

UTF-8로 인코딩 된 바이트 문자열을 Python 유니 코드 문자열로 변환합니다. 그러나 사용할 정확한 절차는 XML 파일을로드하고 구문 분석하는 방법에 따라 다릅니다. 예를 들어 XML 문자열에 직접 액세스하지 않는 경우 codecs모듈 에서 디코더 객체를 사용해야 할 수 있습니다 .


이미 UTF-8로 인코딩되어 있습니다. 오류는 구체적으로 다음과 같습니다. myStrings = deque ([u'Dorf and Svoboda \ u2019s text builds on the str ... and Computer Engineering \ u2019s subdisciplines. ']) 문자열은 다음과 같이 UTF-8 형식입니다. 보시다시피 내부 '\ u2019'에 대해 화를냅니다
Alex B

오, 네, 다른 문제가있는 줄 알았어요.
David Z

7
@Alex B : 아니요, 문자열은 Utf-8이 아니라 유니 코드입니다. Utf-8로 인코딩 하려면'...'.encode('utf-8')
sth

0

성가신 비 ASCII 따옴표를 수정하고 사용 가능한 것으로 강제 변환하기 위해 다음을 작성했습니다.

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }

def unicodeToAscii(inStr):
    try:
        return str(inStr)
    except:
        pass
    outStr = ""
    for i in inStr:
        try:
            outStr = outStr + str(i)
        except:
            if unicodeToAsciiMap.has_key(i):
                outStr = outStr + unicodeToAsciiMap[i]
            else:
                try:
                    print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
                except:
                    print "unicodeToAscii: unknown code (encoded as _)", repr(i)
                outStr = outStr + "_"
    return outStr

0

인쇄 할 수없는 문자를 무시하는 대신 문자열의 대략적인 표현을 화면에 인쇄해야하는 경우 unidecode여기에서 package 를 시도 하십시오.

https://pypi.python.org/pypi/Unidecode

설명은 여기에서 찾을 수 있습니다.

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

이것은 u.encode('ascii', 'ignore')주어진 문자열에 대해를 사용하는 것보다 낫고 u문자 정밀도가 당신이 추구하는 것이 아니지만 여전히 인간의 가독성을 원할 경우 불필요한 두통을 피할 수 있습니다.

Wirawan


-1

파이썬 스크립트 상단에 다음 줄을 추가해보십시오.

# _*_ coding:utf-8 _*_

-1

Python 3.5, 2018

인코딩이 무엇인지 모르지만 유니 코드 파서에 문제가있는 경우 파일을 열고 Notepad++상단 표시 줄에서 Encoding->Convert to ANSI. 그런 다음 다음과 같이 파이썬을 작성할 수 있습니다.

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.