[python] Python 유니 코드 인코딩 오류

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을 인쇄하도록하는 간단한 방법이 있습니까?



답변

아마도 문제는 당신이 그것을 잘 파싱했고 이제 당신은 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 이 기사를 읽고 싶을 수 있습니다.이 기사 는 진행 상황에 대한 기본 자습서로 매우 유용하다고 생각했습니다. 읽은 후에는 어떤 명령을 사용할지 (또는 적어도 나에게 일어난 일) 추측하는 것처럼 느껴지지 않을 것입니다.


답변

더 나은 솔루션 :

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


답변

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

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을 사용하여 유니 코드를 인쇄하는 방법을 보여주는이 답변을 참조하십시오 .


답변

우수 게시물 : 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


답변

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

s.decode('utf-8')

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


답변

성가신 비 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


답변

인쇄 할 수없는 문자를 무시하는 대신 문자열의 대략적인 표현을 화면에 인쇄해야하는 경우 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


댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다