2013-11-04 8 views
5

로 선언 utf-8로 선언 된 파이썬 모듈 내부의 모든 문자열 리터럴은 자동으로 unicodestr의 형식이어야한다고 생각했습니다. 나는 뭔가를 놓치고 있는가? 아니면 이것이 올바른 행동인가?파이썬 유니 코드 문자열 리터럴은 나는이처럼 보이는 UTF-8 헤더와 dummie 파이썬 모듈이 UTF-8

a = u"á" 

그러나 이것은 매우 "예의"도 실제하지 않는 것 : 내가 사용하는 유니 코드 문자열로 a을 얻기 위하여

. 더 나은 옵션이 있습니까?

+1

대신 파이썬 3을 사용하고 * all * 문자열은 유니 코드입니다. –

+0

@MarkRansom 호환성 문제로 인해 Python 버전을 바꿀 수 없습니다 – Caumons

+0

''unicode literal ''을 사용하는 것에 대해 '정중'하지 않습니다. * 왜 * 비현실적이라고 생각합니까? –

답변

5

아니요, 상단의 코덱 은 파이썬에 소스 코드를 해석하는 방법을 알려주고 해당 코덱을 사용하여 유니 코드 리터럴을 해석합니다. 이 아닌 경우 리터럴 바이트 체크를 유니 코드 값으로 변환합니다. PEP 263 상태로 :

이 PEP는 파이썬 소스 파일의 인코딩을 선언하는 구문을 소개 제안한다. 인코딩 정보는 파이썬 파서가 주어진 인코딩을 사용하여 파일을 해석하는 데 사용됩니다. 대부분 특히 은 소스 코드에서 유니 코드 리터럴의 해석을 향상시키고 유니 코드 리터럴 을 작성할 수 있습니다. UTF-8은 유니 코드 인식 편집기에서 직접 사용할 수 있습니다.

강조 광산. 파이썬은 당신이 그것을 예상대로 행동하면

$ cat /tmp/test.py 
example = '☃' 
$ python2.7 /tmp/test.py 
    File "/tmp/test.py", line 1 
SyntaxError: Non-ASCII character '\xe2' in file /tmp/test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

, 당신은 비 포함 된 문자 bytestring 값으로 할 수 없을 것입니다 : 코덱 선언없이

는, 파이썬은 어떻게 비 ASCII 문자를 해석하는 방법을 모르고있다 -ASCII 바이트 값.

터미널이 UTF-8 값을 표시하도록 구성된 경우 UTF-8로 인코딩 된 바이트 문자열을 인쇄하는 것은 '정확함'으로 표시되지만 인코딩이 일치하는 경우에만 가능합니다. 파이썬 3에서

unicode_snowman = '\xe2\x98\x83'.decode('utf8') 
unicode_snowman = unichr(0x2603) 

:

유니 코드 값을 얻을 수있는 정확한 방법은 유니 리터럴을 사용하거나 유니 코드 (바이트 스트링에서 복호화 유니 코드 문자를 정수 코드 포인트 변환 등)를 제조하는 것이다 코덱은 변수 이름이 해석되는 방법에도 적용됩니다. 이름에서 ASCII 범위 외의 문자와 숫자를 사용할 수 있기 때문입니다. 파이썬 3의 기본 코덱은 UTF-8이며, 파이썬 2에서는 ASCII와 반대입니다.

+2

인코딩이 어떤 식 으로든 결과 문자열에 영향을 미치지 않더라도 파일 인코딩을 지정하지 않으면 바이트 문자열에 ASCII가 아닌 문자가 있으면 구문 오류가 발생합니다. –

+0

@SvenMarnach는이 의견에 대해 너무나 감사합니다 !!! 이것은 나의 의심을 완전히 명료하게합니다! :) 대답을 – Caumons

+0

@SvenMarnach : 맞습니다. 바이트 값 자체가 코덱 집합을 기반으로 변경되지는 않더라도 여기서는 보수적이며 코덱 집합없이 파이썬 소스 코드를 구문 분석하지 않습니다. –

2

아니요, 단지 소스 코드 인코딩입니다.

 # coding=<encoding name> 

or (using formats recognized by popular editors) 

     #!/usr/bin/python 
     # -*- coding: <encoding name> -*- 

or 

     #!/usr/bin/python 
     # vim: set fileencoding=<encoding name> : 

: http://www.python.org/dev/peps/pep-0263/

는 소스 코드 인코딩을 정의하려면 참조하십시오, 마법의 코멘트는 같은 두 파일의 첫 번째 또는 두 번째 라인과 소스 파일에 배치해야 이것은 모든 리터럴이 유니 코드 리터럴을 어떻게 디코딩해야 하는지를 알려주는 것은 아닙니다.

리터럴을 유니 코드로 설정하려면 unicode 함수 또는 u 접두어를 사용해야합니다.

N.B. python3에서 모든 문자열은 유니 코드입니다.

+0

+1 답변을 보내 주셔서 감사합니다. :) – Caumons

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

문자열 리터럴 유니 코드를 만들지 않습니다.

SyntaxError: Non-ASCII character '\xd9' in file file.py 
on line 2, but no encoding declared; 
see http://www.python.org/peps/pep-0263.html for details 

하기 때문에이를 허용하기 : 나는 그것을 실행하는 경우

# هذا تعليق عربي 
print type('نص عربي') 

그것은 SyntaxError 예외가 발생합니다 :이 예제를 가지고, 내가 아랍어 주석 및 문자열을 가진 파일이 파일은 UTF-8입니다

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

# هذا تعليق عربي 
print type('نص عربي') 

지금은 잘 실행하지만 문자열 유니 코드를하지 않는 한 여전히 <type 'str'>을 인쇄 : 나는 파일이 UTF-8로 인코딩 된 것을 인터프리터에게 그 라인을 추가해야합니다

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

# هذا تعليق عربي 
print type(u'نص عربي') 
+0

예를 들어 주셔서 감사합니다! +1 – Caumons

+0

파일 인코딩을 사용하더라도 ASCII가 아닌'str '인쇄가 OK가됩니다. 이러한 종류의 문자열을 처리 할 때 런타임 오류가 발생할 수 있습니다. 그렇지 않습니까? 그래서 도덕적 인면은 비 ASCII 문자를 사용할 경우 헤더의 일부분을 잠재적 인 충돌 문자열과 함께 항상 'u'로 사용하십시오. 내가 맞습니까? – Caumons

+0

@Caumons 유니 코드가 아닌 경우 인쇄되거나 처리되지 않습니다. 한 문자는 두 개의 다른 문자로 간주됩니다. 'print len ​​(u'أ '); len ('أ')을 인쇄하십시오. –