programing tip

Python 유니 코드 인코딩 오류

itbloger 2020. 8. 19. 07:49
반응형

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모듈 에서 디코더 객체를 사용해야 할 수 있습니다 .


I wrote the following to fix the nuisance non-ascii quotes and force conversion to something usable.

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

If you need to print an approximate representation of the string to the screen, rather than ignoring those nonprintable characters, please try unidecode package here:

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

The explanation is found here:

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

This is better than using the u.encode('ascii', 'ignore') for a given string u, and can save you from unnecessary headache if character precision is not what you are after, but still want to have human readability.

Wirawan


Try adding the following line at the top of your python script.

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

Python 3.5, 2018

If you don't know what the encoding but the unicode parser is having issues you can open the file in Notepad++ and in the top bar select Encoding->Convert to ANSI. Then you can write your python like this

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)

참고URL : https://stackoverflow.com/questions/3224268/python-unicode-encode-error

반응형