나는 여전히 파이썬을 배우고 있으며 의심이 있습니다.
파이썬 2.6.x에서는 보통 다음과 같이 파일 헤더에 인코딩을 선언합니다 ( PEP 0263 에서와 같이 ).
# -*- coding: utf-8 -*-
그 후, 내 문자열은 평소와 같이 작성됩니다.
a = "A normal string without declared Unicode"
그러나 파이썬 프로젝트 코드를 볼 때마다 인코딩이 헤더에서 선언되지 않습니다. 대신 다음과 같이 모든 문자열에서 선언됩니다.
a = u"A string with declared Unicode"
차이점이 뭐야? 이것의 목적은 무엇입니까? Python 2.6.x가 기본적으로 ASCII 인코딩을 설정한다는 것을 알고 있지만 헤더 선언으로 재정의 할 수 있으므로 문자열 선언 당 포인트는 무엇입니까?
부록 : 파일 인코딩과 문자열 인코딩을 혼합 한 것 같습니다. 설명해 주셔서 감사합니다 🙂
답변
다른 사람들이 언급했듯이 그것들은 두 가지 다른 것입니다.
을 지정하면# -*- coding: utf-8 -*-
저장 한 소스 파일이 utf-8
. Python 2의 기본값은 ASCII입니다 (Python 3의 경우 utf-8
). 이것은 인터프리터가 파일의 문자를 읽는 방법에만 영향을줍니다.
일반적으로 인코딩이 무엇이든 상관없이 높은 유니 코드 문자를 파일에 포함하는 것은 아마도 최선의 생각이 아닙니다. 두 인코딩 모두에서 작동하는 문자열 유니 코드 이스케이프를 사용할 수 있습니다.
와u
같이 앞에가 있는 문자열을 선언u'This is a string'
하면 파이썬 컴파일러에 문자열이 바이트가 아니라 유니 코드임을 알립니다. 이것은 인터프리터에 의해 대부분 투명하게 처리됩니다. 가장 명백한 차이점은 이제 문자열에 유니 코드 문자를 포함 할 수 있다는 것입니다 (즉, u'\u2665'
이제 합법적 임). 를 사용 from __future__ import unicode_literals
하여 기본값으로 설정할 수 있습니다 .
이것은 Python 2에만 적용됩니다. Python 3에서 기본값은 유니 코드이며 b
앞에 를 지정해야합니다 (예 b'These are bytes'
: 바이트 시퀀스를 선언).
답변
다른 사람들이 말했듯 # coding:
이 소스 파일이 저장되는 인코딩을 지정합니다. 다음은이를 설명하는 몇 가지 예입니다.
디스크에 cp437 (내 콘솔 인코딩)로 저장되었지만 인코딩이 선언되지 않은 파일
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
산출:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
# coding: cp437
추가 된 파일의 출력 :
über '\x81ber'
über u'\xfcber'
처음에 파이썬은 인코딩을 몰랐고 비 ASCII 문자에 대해 불평했습니다. 인코딩을 알고 나면 바이트 문자열은 실제로 디스크에 있던 바이트를 얻습니다. 유니 코드 문자열의 경우 Python은 \ x81을 읽고 cp437에서 ü 라는 것을 알고 U + 00FC 인 ü 에 대한 유니 코드 코드 포인트로 디코딩했습니다 . 바이트 문자열이 인쇄 될 때 Python은 16 진수 값 81
을 콘솔에 직접 보냈습니다 . 유니 코드 문자열이 인쇄 될 때, 파이썬은 제대로 CP437로 내 콘솔 인코딩을 감지 유니 코드 변환 ü를 위한 CP437 값 ü .
UTF-8로 선언되고 저장된 파일은 다음과 같습니다.
├╝ber '\xc3\xbcber'
über u'\xfcber'
UTF-8에서 ü 는 16 진수 바이트로 인코딩 C3 BC
되므로 바이트 문자열에 해당 바이트가 포함되지만 유니 코드 문자열은 첫 번째 예와 동일합니다. 파이썬은 2 바이트를 읽고 올바르게 디코딩했습니다. 파이썬은 ü를 나타내는 두 개의 UTF-8 바이트 를 내 cp437 콘솔로 직접 보냈기 때문에 바이트 문자열을 잘못 인쇄했습니다 .
여기서 파일은 cp437로 선언되었지만 UTF-8로 저장됩니다.
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
바이트 문자열은 여전히 디스크에 바이트 (UTF-8 hex bytes C3 BC
)를 가지고 있지만, 단일 UTF-8 인코딩 문자 대신 두 개의 cp437 문자로 해석했습니다. 유니 코드 코드 포인트로 변환 된 두 문자와 모든 것이 잘못 인쇄됩니다.
답변
그것은 문자열의 형식을 설정하지 않습니다. 파일의 형식을 설정합니다. 해당 헤더를 사용하더라도 "hello"
유니 코드 문자열이 아닌 바이트 문자열입니다. 유니 코드로 만들려면 u"hello"
모든 곳 에서 사용해야 합니다. 헤더는 .py
파일을 읽을 때 사용할 형식에 대한 힌트입니다 .
답변
헤더 정의는 런타임에 결과 문자열이 아니라 코드 자체의 인코딩을 정의하는 것입니다.
utf-8 헤더 정의없이 파이썬 스크립트에 ۲과 같은 비 ASCII 문자를 넣으면 경고가 발생합니다
답변
변수에 대한 변환을 수행 할 수 있도록 unicoder라는 다음 모듈을 만들었습니다.
import sys
import os
def ustr(string):
string = 'u"%s"'%string
with open('_unicoder.py', 'w') as script:
script.write('# -*- coding: utf-8 -*-\n')
script.write('_ustr = %s'%string)
import _unicoder
value = _unicoder._ustr
del _unicoder
del sys.modules['_unicoder']
os.system('del _unicoder.py')
os.system('del _unicoder.pyc')
return value
그런 다음 프로그램에서 다음을 수행 할 수 있습니다.
# -*- coding: utf-8 -*-
from unicoder import ustr
txt = 'Hello, Unicode World'
txt = ustr(txt)
print type(txt) # <type 'unicode'>