Python : 유니 코드 이스케이프 된 문자열에서 .format () 사용


156

Python 2.6.5를 사용하고 있습니다. 내 코드에는 "이상"기호를 사용해야합니다. 여기 간다:

>>> s = u'\u2265'
>>> print s
>>> 
>>> print "{0}".format(s)
Traceback (most recent call last):
     File "<input>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265'
  in position 0: ordinal not in range(128)`  

이 오류가 발생하는 이유는 무엇입니까? 올바른 방법이 있습니까? 이 .format()기능 을 사용해야합니다 .

답변:


243

두 번째 문자열을 유니 코드 문자열로 만드십시오.

>>> s = u'\u2265'
>>> print s

>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 

40
@Kit : 모든 리터럴을 유니 코드로 만들려면 (파이썬 3 에서처럼) from __future__ import unicode_literals소스 파일의 시작 부분에 넣으십시오.
Philipp

1
예,이 "% s"% u "\ u2265"가 작동하기 때문에 % 형식화에 익숙하다면 "{}". format (u "\ u2265")에서 예외가 발생합니다.
Hylidan

2
이 간단한 깨달음을 발견 할 때까지 내가
겪은


5

왜 그런지에 대한 정보가 조금 더 있습니다.

>>> s = u'\u2265'
>>> print s

printUTF-8로 설정된 환경에 자동으로 시스템 인코딩을 사용 하기 때문에 작동합니다 . (을 통해 확인할 수 있습니다 import sys; print sys.stdout.encoding)

>>> print "{0}".format(s)

format호출 된 유형의 인코딩과 일치하려고 시도하기 때문에 실패합니다 (이 문서에 대한 문서를 찾을 수는 없지만 이것이 주목 한 동작입니다). 문자열 리터럴은 파이썬 2에서 ASCII로 인코딩 된 바이트 문자열이므로 ASCII format로 인코딩 s을 시도하면 예외가 발생합니다. 관찰 :

>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)

이것이 기본적으로 이러한 접근 방식이 작동하는 이유입니다.

>>> s = u'\u2265'
>>> print u'{}'.format(s)

>>> print '{}'.format(s.encode('utf-8'))

소스 문자 세트는 인코딩 선언으로 정의됩니다. 소스 파일에 인코딩 선언이없는 경우 ASCII입니다 ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )


1
오 나는이 파이썬에서 이해 유니 코드에 큰 도움이 될 것으로, 그리고 일반적으로 컴퓨터 시스템의 텍스트 표현 : nedbatchelder.com/text/unipain.html은
LPS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.