UnicodeEncodeError : 'ascii'코덱은 위치 20에서 문자 u '\ xa0'을 인코딩 할 수 없습니다. 서 수가 범위 내에 있지 않습니다 (128)


1296

다른 웹 페이지 (다른 사이트)에서 가져온 텍스트의 유니 코드 문자를 처리하는 데 문제가 있습니다. BeautifulSoup을 사용하고 있습니다.

문제는 오류가 항상 재현 가능한 것은 아니라는 것입니다. 때로는 일부 페이지에서 작동하며 때로는UnicodeEncodeError 않습니다. 나는 생각할 수있는 모든 것을 시도했지만 유니 코드 관련 오류를 발생시키지 않고 일관되게 작동하는 것을 찾지 못했습니다.

문제를 일으키는 코드 섹션 중 하나가 아래에 나와 있습니다.

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

위의 스 니펫이 실행될 때 일부 문자열에서 생성 된 스택 추적은 다음과 같습니다.

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

일부 페이지 (또는 일부 사이트의 페이지)가 인코딩 될 수 있고 다른 페이지는 인코딩되지 않을 수 있기 때문입니다. 모든 사이트는 영국을 기반으로하며 영국 소비를위한 데이터를 제공하므로 영어 이외의 다른 언어로 작성된 텍스트 처리와 관련한 문제는 없습니다.

누구 든지이 문제를 일관되게 해결할 수 있도록이 문제를 해결하는 방법에 대한 아이디어가 있습니까?


1
개발자가 아닌 사용자로서 이러한 오류가 발생하면 serverfault.com/questions/54591/…askubuntu.com/questions/599808/…를
그 브라질 가이

이 점에 대해서는 onlinegdb.com/online_python_interpreter 를 사용하지 마십시오 . 해당 인터프리터를 사용하여 물건을 시험 해보고 유니 코드에 올바르게 구성되지 않았습니다! 항상 'B'\ nnn ''형식으로 인쇄하고있었습니다 ... 원하는 모든 것이 길레였습니다! VM을 시험해
보니

4
이것을보십시오 import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore')).
hhh

@hhh 스 니펫을 실행했습니다. NameError : name '
myText'is

9
스크립트를 실행하기 전에 쉘에서 PYTHONIOENCODING 을 설정 하십시오 :$ export PYTHONIOENCODING=utf8
Noam Manos

답변:


1361

Python Unicode HOWTO 를 읽어야합니다 . 이 오류는 첫 번째 예입니다 입니다.

기본적으로 str유니 코드에서 인코딩 된 텍스트 / 바이트로 변환 하는 데 사용 을 중지하십시오 .

대신 .encode()문자열을 인코딩하는 데 올바르게 사용 하십시오.

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

또는 전적으로 유니 코드로 작동합니다.


23
동의했다! 내가 배운 좋은 규칙은 "유니 코드 샌드위치"아이디어를 사용하는 것입니다. 스크립트는 외부 세계에서 바이트를 허용하지만 모든 처리는 유니 코드로 수행해야합니다. 데이터를 출력 할 준비가되었을 때만 바이트 단위로 데이터를 숨겨야합니다!
Andbdrew

256
다른 사람이 이것으로 혼란 스러울 경우 이상한 것을 발견했습니다. 터미널은 utf-8을 사용 print하고 utf-8 문자열은 훌륭하게 작동합니다. 그러나 프로그램 출력을 파일로 파이프하면을 던집니다 UnicodeEncodeError. 출력 (파일 또는 파이프) 리디렉션 사실, 나는 그 발견 sys.stdout.encoding입니다 None! 태킹 .encode('utf-8')하면 문제가 해결됩니다.
drevicko

93
@drevicko : PYTHONIOENCODING=utf-8대신 유니 코드 문자열을 인쇄하고 환경이 예상 인코딩을 설정하도록합니다.
jfs

1
@ steinar : 모든 경우에 유효한 것은 없습니다. 일반적으로 사용자는 파이썬을 사용하여 유틸리티를 구현하는 것을 신경 쓰지 않아야합니다 (어떤 이유로 든 다른 언어로 다시 구현하기로 결정한 경우 인터페이스가 변경되어서는 안 됨). 특정 환경. 사용자가 문자 인코딩을 지정하도록 강요하는 것은 잘못된 UI입니다. 필요한 경우 문자 형식을 보고서 형식으로 포함하십시오. 참고 : 하드 코딩 된 인코딩은 일반적인 경우 "감지 가능한 기본값"이 될 수 없습니다.
jfs

13
이것은 나쁘고 혼란스러운 조언입니다. 사람들이 str을 사용하는 이유는 객체가 이미 문자열이 아니기 때문에 .encode()호출 할 메소드 가 없기 때문 입니다.
Cerin

433

이것은 고전적인 파이썬 유니 코드 통증 포인트입니다! 다음을 고려하세요:

a = u'bats\u00E0'
print a
 => batsà

지금까지는 좋았지 만 str (a)를 호출하면 어떻게되는지 보자.

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

딥, 그 누구도 잘하지 않을거야! 오류를 해결하려면 .encode로 바이트를 명시 적으로 인코딩하고 파이썬에게 사용할 코덱을 알려주십시오.

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

\\ u00E0!

문제는 str ()을 호출 할 때 파이썬이 기본 문자 인코딩을 사용하여 주어진 바이트를 인코딩하고 인코딩하는 경우가 있습니다.이 경우 때로는 유니 코드 문자를 나타냅니다. 문제를 해결하려면 .encode ( 'whatever_unicode')를 사용하여 주어진 문자열을 처리하는 방법을 파이썬에 알려 주어야합니다. 대부분의 경우 utf-8을 사용해도 괜찮습니다.

이 주제에 대한 훌륭한 설명을 보려면 Ned Batchelder의 PyCon 이야기를 참조하십시오. http://nedbatchelder.com/text/unipain.html


85
개인 참고 사항 : ".encode"를 입력하려고 할 때 실수로 ".unicode"를 입력하지 않은 이유가 무엇인지 궁금해하십시오.
Huffman을 건너 뛰십시오

9
좋은 조언. 그러나 문자열이거나 문자열이 아닌 객체를 인쇄하기 위해 str (x)를 사용할 때 대신 무엇을합니까? str (x)는 x가 숫자, 날짜 시간, 부울 또는 일반 문자열 인 경우 작동합니다. 갑자기 유니 코드이면 작동이 중지됩니다. 동일한 동작을 얻는 방법이 있습니까? 아니면 객체가 .encode를 사용하는 문자열인지 테스트하기 위해 IF 검사를 추가해야합니까? 그렇지 않으면 str ()?
Dirk R

같은 질문을 None가치 있게 요구할 수 있습니다 .
Vadorequest

210

다음과 같이 기호를 제거하고 문자열을 문자열로 유지하는 우아한 해결 방법을 찾았습니다.

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

ignore 옵션 을 사용하는 것은 여기에 표시된대로 유니 코드 및 국제화 지원을 사용하는 코드에서 자동으로 삭제되므로 (유니 코드 변환 ) 위험 합니다.

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

17
당신은 내 하루를했다! utf-8의 경우 다음을 수행하면 충분합니다.yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76

나에게 이것은 효과가 있었지만 내 사건은 달랐다. 파일 이름을 저장하고 이름에 "/"가 있었고 경로가 존재하지 않았으므로 .replace ( "/", "")를 사용해야하므로 저장되었습니다. 내 스크립트. ascii를 무시하면서 'utf-8'도 작동합니다.
Akash Kandpal

1
파일 경로를 올바르게 연결하는 @ harrypotter0은 os.path.join()크로스 플랫폼 프로그래밍을 시작할 때 매우 좋은 습관입니다. :)
login_not_failed 7:22에

152

글쎄, 나는 모든 것을 시도했지만 도움이되지 않았다. 인터넷 검색 후 나는 다음을 생각했고 도움이되었다. 파이썬 2.7이 사용 중입니다.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
이러지 마 stackoverflow.com/questions/3828723/… , 비록 당신이 오류를 검색 할 때 결과의 상단 근처 에이 stackoverflow.com/a/31137935/2141635 과 같은 답변이 있을 때 왜 그것이 좋은 생각처럼 보일 수 있는지 알 수 있습니다.
Padraic Cunningham

21
나는이 주제의 거의 모든 제안을 시도했지만 실제로는 효과가 없었습니다. 마침내 나는 이것을 시도했다. 그리고 그것은 단순하고 훌륭하게 작동 한 유일한 사람입니다. 누군가 "이 작업을 수행하지 마십시오. 간단한 해결책을 제시하십시오. 그렇지 않은 경우이 방법을 사용하십시오. 훌륭한 사본과 과거 해결책이므로
Richard de Ree

4
python3에서 어떻게 할 수 있습니까? 기뻐할 것입니다.
Kanerva Peter

3
많은 좌절 끝에이 것이 효과가있었습니다. 무리 감사.
Avraham Zhurba

4
난 그냥 추가 할 것if sys.version_info.major < 3:
위반 교수 팔켄 계약

87

인쇄조차 실패하는 미묘한 문제는 환경 변수를 잘못 설정 한 것입니다. 여기서 LC_ALL은 "C"로 설정됩니다. 데비안에서는 로케일의 데비안 위키 설정을 권장하지 않습니다.

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà

정확히 같은 문제가 발생하여 보고 하기 전에 확인하지 않았습니다 . 고마워 그런데 처음 두 명령을로 바꿀 수 있습니다 env|grep -E '(LC|LANG)'.
Dmitry Verhoturov

잘못된 인코딩 문제에 대한 내 두 센트. 나는 종종 mc"서브 쉘 모드"( Ctrl-O)를 사용하고 bash에 다음 별칭을 추가하는 것을 잊었다 alias mc="LANG=en_EN.UTF-8 mc". 따라서 ru_RU.UTF-8내부적으로 의존하는 잘못 작성된 스크립트를 실행하려고하면 죽습니다. 실제 문제를 발견하기 전에이 스레드에서 많은 것을 시도했습니다. :)
login_not_failed

당신은 굉장합니다. GSUTIL 에서이 문제로 인해 내 rsync가 실패했습니다. LC_ALL을 수정했으며 모든 것이 와인처럼 잘 작동합니다. <3 감사합니다 <3
dsignr

27

나를 위해 일한 것은 다음과 같습니다.

BeautifulSoup(html_text,from_encoding="utf-8")

이것이 누군가를 돕기를 바랍니다.


25

실제로 대부분의 경우 해당 문자를 제거하는 것이 훨씬 간단하다는 것을 알았습니다.

s = mystring.decode('ascii', 'ignore')

26
"완벽하게"는 일반적으로 수행하는 것이 아닙니다. 올바르게 처리하는 방법을 알아 내야 할 것들을 버립니다.
tripleee

7
파이썬이 모든 언어를 지원해야하므로 "비 영어"문자 만 제거하는 것은 해결책이 아닙니다.
alemol

8
공감. 이것은 올바른 해결책이 아닙니다. 유니 코드 작업 방법 배우기 : joelonsoftware.com/articles/Unicode.html
Andrew Ferrier

4
봐,이 특정 답을 제시 할 수있는 가장 현명한 방법은이 방법에 : 그 아스키 수여하고 특정 언어와 사용자의 특정 권한을 인식 - 이것은이다 탈출 해치 피상적를 해킹 할 수있는 사용자를 위해 이용 될 수있다, 첫 번째 패스는 완전한 유니 코드 지원이 구현되기 전에 예비 작업을 위해 스크립트를 작성합니다.
lol

5
내부 회사 응용 프로그램에서 영어 텍스트를 표준 출력으로 인쇄 해야하는 스크립트를 작성하는 경우 문제가 해결되기를 원합니다. 뭐든간에
kagronick

25

문제는 유니 코드 문자를 인쇄하려고하지만 터미널이 지원하지 않는다는 것입니다.

language-pack-en패키지를 설치 하여 문제를 해결할 수 있습니다 .

sudo apt-get install language-pack-en

지원되는 모든 패키지 (Python 포함)에 대한 영어 번역 데이터 업데이트를 제공합니다. 필요한 경우 다른 언어 패키지를 설치하십시오 (인쇄하려는 문자에 따라 다름).

일부 Linux 배포판에서는 기본 영어 로케일이 올바르게 설정되어 있는지 확인해야합니다 (따라서 유니 코드 문자는 쉘 / 터미널로 처리 될 수 있음). 때로는 수동으로 구성하는 것보다 설치하기가 더 쉽습니다.

그런 다음 코드를 작성할 때 코드에 올바른 인코딩을 사용해야합니다.

예를 들면 다음과 같습니다.

open(foo, encoding='utf-8')

여전히 문제가 발생하면 다음과 같은 시스템 구성을 다시 확인하십시오.

  • 로케일 파일 ( /etc/default/locale)

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    또는:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • 쉘 의 LANG/ 값 LC_CTYPE.

  • 쉘이 지원하는 로케일을 확인하십시오.

    locale -a | grep "UTF-8"

최신 VM의 문제 및 솔루션 시연

  1. VM을 초기화하고 프로비저닝합니다 (예 :) vagrant.

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    사용 가능한 Ubuntu 상자를 참조하십시오 . .

  2. 유니 코드 문자 인쇄 (예 : 와 같은 상표 기호 ) :

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. 지금 설치 language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. 이제 문제가 해결되어야합니다.

    $ python -c 'print(u"\u2122");'
    
  5. 그렇지 않으면 다음 명령을 시도하십시오.

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    

1
language-pack-en파이썬이나이 질문과 어떤 관련이 있습니까? AFAIK, 메시지에 대한 언어 번역을 제공 할 수 있지만 인코딩과는 아무런 관련이 없습니다.
Alastair McCormack

2
일부 Linux 배포판에서는 특히 터미널에서 Python 스크립트를 실행할 때 기본 영어 로케일이 올바르게 설정되어 있는지 확인해야합니다. 그것은 한 시점에서 나를 위해 일했습니다. 참조 : 문자 인코딩
kenorb

그래. 영어 이외의 로케일을 사용하고 싶습니까? /etc/locale.gen로케일을 사용하기 전에 사용자가 로케일을 빌드하도록 편집 해야한다고 생각합니까?
Alastair McCormack

1
@AlastairMcCormack ( 존재하지 않는) LANG에서 주석 처리 하고 실행 했지만 도움이되지 않았습니다. 많은 문서를 찾지 못하고 그 내용을 나열하는 것이별로 도움이되지 않기 때문에 정확히 무엇을하는지 잘 모르겠습니다 . /etc/default/locale/etc/locale.genlocale-genlanguage-pack-en
kenorb

1
이미 데스크탑 시스템에 utf-8 로켈이 없을 가능성이 낮습니다. 즉, 아무것도 설치할 필요가 없으며 대신 LANG/ LC_CTYPE/ LC_ALL를 구성하십시오 (예 :) LANG=C.UTF-8.
jfs

19

쉘에서 :

  1. 다음 명령으로 지원되는 UTF-8 로케일을 찾으십시오.

    locale -a | grep "UTF-8"
  2. 스크립트를 실행하기 전에 다음과 같이 내보내십시오.

    export LC_ALL=$(locale -a | grep UTF-8)

    또는 수동으로

    export LC_ALL=C.UTF-8
  3. 특수 문자를 인쇄하여 테스트하십시오. 예 :

    python -c 'print(u"\u2122");'

위의 우분투에서 테스트되었습니다.


그렇습니다. 이것은 가장 짧은 대답입니다. .encode를 사용하도록 소스 코드를 수정할 수 없습니다
Luat Nguyen-Neo.Mxn0

16

스크립트 시작 부분 (또는 두 번째 줄)에 아래 줄을 추가하십시오.

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

그것은 파이썬 소스 코드 인코딩의 정의입니다. PEP 263에 대한 추가 정보 .


2
외부 파일에서로드 된 처리 된 텍스트에 utf-8 인코딩이 포함되어 있으면 문제가 해결되지 않습니다. 이것은 주어진 파이썬 스크립트 자체로 작성된 리터럴에만 도움이되며 파이썬 인터프리터의 단서이지만 텍스트 처리에는 영향을 미치지 않습니다.
Mikaelblomkvistsson

16

다음은 소위 "cop out"답변에 대한 해시입니다. 성가신 시위에도 불구하고 귀찮은 캐릭터 / 문자열을 버리는 것이 좋은 해결책이되는 상황이 있습니다.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

그것을 테스트 :

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

결과 :

1
test
98°
98

제안 : toAscii대신 이 함수의 이름을 지정 하시겠습니까? 그것은 선호의 문제입니다.

이것은 Python 2 용으로 작성되었습니다. Python 3의 경우, bytes(obj,"ascii")대신 에 사용하고 싶습니다 str(obj). 나는 이것을 아직 테스트하지는 않았지만 어느 시점에서 대답을 개정 할 것입니다.


8

나는 항상 파이썬 파일의 처음 두 줄에 아래 코드를 넣습니다.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

6

여기에 간단한 도우미 함수가 있습니다 .

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')

이스케이프 처리 된 바이트 스트링 (아스키 인코딩을 사용하여 임의의 유니 코드 문자열을 바이트로 변환)을 얻으려면 backslashreplaceerror handler를 사용할 수 있습니다 u'\xa0'.encode('ascii', 'backslashreplace'). 그러한 표현을 피하고 대신 ASCII 이외의 문자를 허용하도록 환경을 구성해야하지만 2016입니다!
jfs

새해 복 많이 받으세요 @JFSebastian. 방금 Python-Unicode 문제에 좌절하고 마침내이 솔루션을 얻었습니다. 나는 이것에 대해 몰랐다. 어쨌든 팁 주셔서 감사합니다.
Parag Tyagi -morpheus-


4

터미널을 열고 아래 명령을 실행하십시오 :

export LC_ALL="en_US.UTF-8"

3

방금 다음을 사용했습니다.

import unicodedata
message = unicodedata.normalize("NFKD", message)

이에 대한 설명서가 무엇인지 확인하십시오.

unicodedata. normalize (form, unistr) 유니 코드 문자열 unistr에 대한 일반 양식 양식을 반환합니다. 형식에 유효한 값은 'NFC', 'NFKC', 'NFD'및 'NFKD'입니다.

유니 코드 표준은 표준 동등성 및 호환성 동등성 정의를 기반으로 유니 코드 문자열의 다양한 정규화 형식을 정의합니다. 유니 코드에서는 여러 문자를 다양한 방식으로 표현할 수 있습니다. 예를 들어, 문자 U + 00C7 (CEDILLA가있는 라틴 대문자 C)은 시퀀스 U + 0043 (라틴 대문자 C) U + 0327 (복합 CEDILLA)로 표현 될 수도 있습니다.

각 문자마다 정규 형식 C와 일반 형식 D의 두 가지 정규 형식이 있습니다. 정규 형식 D (NFD)는 정식 분해라고도하며 각 문자를 분해 형식으로 변환합니다. 일반 형식 C (NFC)는 먼저 표준 분해를 적용한 다음 사전 조합 된 문자를 다시 작성합니다.

이 두 가지 형식 외에도 호환성 동등성에 따라 두 가지 추가 일반 형식이 있습니다. 유니 코드에서는 일반적으로 다른 문자와 통합되는 특정 문자가 지원됩니다. 예를 들어 U + 2160 (ROMAN NUMERAL ONE)은 실제로 U + 0049 (라틴 대문자 L)와 동일합니다. 그러나 기존 문자 세트 (예 : gb2312)와의 호환성을 위해 유니 코드로 지원됩니다.

일반적인 형식 KD (NFKD)는 호환성 분해를 적용합니다. 즉, 모든 호환성 문자를 동등한 것으로 바꿉니다. 정상 형태 KC (NFKC)는 먼저 상용 성 분해를 적용한 다음 표준 조성을 적용합니다.

두 개의 유니 코드 문자열이 정규화되어 인간 독자와 동일하게 보이지만 하나는 결합 문자가 있고 다른 하나는 그렇지 않은 경우 동일하지 않습니다.

나를 위해 그것을 해결하십시오. 간단하고 쉽습니다.


3

아래 솔루션이 나를 위해 일했습니다. 방금 추가했습니다.

u "문자열"

내 문자열 앞에 (문자열을 유니 코드로 표시).

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)

3

아아 이것은 적어도 Python 3에서 작동합니다 ...

파이썬 3

때로는 오류가 환경 변수에 있고 따라서 enconding

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

인코딩에서 오류가 무시되는 곳.


2

방금이 문제가 있었고 Google이 나를 이끌었습니다. 일반 솔루션에 추가하면 다음과 같습니다.

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

Ned의 프레젠테이션 을 읽은 후에이 아이디어가있었습니다. .

그러나 이것이 왜 효과가 있는지 완전히 이해한다고 주장하지는 않습니다. 따라서 누구나이 답변을 편집하거나 설명 할 수있는 의견을 남길 수 있다면 감사하겠습니다.


3
type가치 는 무엇입니까 ? 이 전후에? 나는 왜 작동하는 것은 수행하여 있다고 생각 unic += value과 같은 인 unic = unic + value당신은 문자열과 파이썬 다음 결과에 대한 유니 코드를 가정 유니 코드, 추가 unic즉,보다 정확한 유형 (이 작업을 수행 할 때 생각을 a = float(1) + int(1), a부동하게) 및 그런 다음 유니 코드 인 새로운 객체 를 value = unic가리 킵니다 . valueunic
Tom Myddeltyn

2

manage.py migrate현지화 된 비품으로 Django에서 실행할 때이 오류가 발생했습니다 .

우리의 소스에는 # -*- coding: utf-8 -*-MySQL이 utf8에 대해 올바르게 구성되었으며 Ubuntu에 적절한 언어 팩과 값 이 있음을 선언했습니다 /etc/default/locale.

문제는 단순히 Django 컨테이너 (Docker 사용)에 LANGenv var 가 누락되었다는 것 입니다.

설정 LANGen_US.UTF-8다시 실행 마이그레이션이 문제를 해결하기 전에 컨테이너를 다시 시작.


1

여기에 많은 답변 (예 : @agf 및 @Andbdrew)이 OP 질문의 가장 즉각적인 측면을 이미 다루었습니다.

그러나 파이썬에서 인코딩을 이해하려고 노력하는 동안 저를 좋아하는 모든 사람에게 크게 무시되고 중요하게 생각되는 미묘하지만 중요한 측면이 있다고 생각합니다. 파이썬 2 대 파이썬 3 문자 표현 관리는 크게 다릅니다. . 버전 인식을하지 않고 파이썬에서 인코딩에 대해 읽는 사람들과 관련이 있다는 혼란이 있습니다.

OP 문제의 근본 원인을 이해하는 데 관심이있는 사람은 Spolsky의 문자 표현 및 유니 코드에 대한 소개를 읽은 다음 Python 2 및 Python 3의 유니 코드에서 Batchelder 로 이동하십시오 .


예, 내 오류는 python 2.7, 'a'.format (u'ñ')에 있었고 올바른 해결책은 .encode ( 'utf-8')를 사용하지 않고 항상 유니 코드 문자열을 사용하는 것입니다 (python 3의 기본값) ) : u'a'.format (u'ñ '),
Rogelio

1

변수를 str (변수)로 변환하지 마십시오. 때로는 문제가 발생할 수 있습니다.

피해야 할 간단한 팁 :

try: 
    data=str(data)
except:
    data = data #Don't convert to String

위의 예제는 인코딩 오류도 해결합니다.


당신 같은이 넣은 사람은 아니다 작업은 제외에 오류로 실행하겠습니다
Aurele Collinet

0

packet_data = "This is data"초기화가 끝나면 다음 줄에서 다음 과 같이 하십시오 packet_data.

unic = u''
packet_data = unic


0

이 문제는 유니 코드 문자를에 출력하려고 stdout했지만sys.stdout.write 인쇄하지 않고로 출력하려고했습니다 (다른 파일로도 출력을 지원할 수 있음).

BeautifulSoup의 자체 문서 에서 코덱 라이브러리 로이 문제를 해결했습니다.

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)

0

이 문제는 django 프로젝트가 Apache를 사용하여 배포 될 때 종종 발생합니다. Apache는 / etc / sysconfig / httpd에서 환경 변수 LANG = C를 설정하므로 파일을 열고이 설정에 댓글을 달거나 풍미로 변경하십시오. 또는 WSGIDaemonProcess 명령의 lang 옵션을 사용하십시오.이 경우 다른 LANG 환경 변수를 다른 가상 호스트로 설정할 수 있습니다.


0

권장 솔루션은 저에게 효과가 없었으며 ASCII가 아닌 모든 문자를 덤핑하면서 살 수 있었으므로

s = s.encode('ascii',errors='ignore')

오류가 발생하지 않는 스트립 된 것으로 나를 떠났습니다.


0

이것은 작동합니다 :

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

산출:

>>>bats
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.