파이썬에서 유니코드를 문자열로 선언하는 이유는 무엇입니까?
저는 아직 파이썬을 배우고 있는데 의심이 갑니다.
python 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 인코딩을 설정하지만 헤더 선언에 의해 재정의될 수 있습니다. 그렇다면 문자열당 선언의 의미는 무엇입니까?
부록:파일 인코딩과 문자열 인코딩을 혼동한 것 같습니다.설명해 주셔서 감사합니다 :)
다른 사람들이 언급했듯이, 그것들은 두 가지 다른 것입니다.
당신이 지정할 때, 당신이 저장한 소스 파일은 Python에게utf-8
Python 2의 기본값은 ASCII입니다(Python 3의 경우는utf-8
이는 인터프리터가 파일의 문자를 읽는 방법에만 영향을 미칩니다.
일반적으로 인코딩에 관계없이 높은 유니코드 문자를 파일에 포함시키는 것은 최선의 방법이 아닙니다. 두 인코딩 모두 사용할 수 있는 유니코드 이스케이프 문자열을 사용할 수 있습니다.
앞에 a가 있는 문자열을 선언할 때 다음과 같이u'This is a string'
이것은 파이썬 컴파일러에게 문자열이 바이트가 아닌 유니코드임을 알려줍니다.이것은 대부분 인터프리터에 의해 투명하게 처리됩니다. 가장 분명한 차이점은 이제 유니코드 문자를 문자열에 포함시킬 수 있다는 것입니다.u'\u2665'
이제 합법입니다.).사용할 수 있습니다.from __future__ import unicode_literals
기본값으로 설정합니다.
이것은 Python 2에만 적용됩니다. Python 3의 기본값은 Unicode이며, 다음을 지정해야 합니다.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'
처음에 Python은 인코딩을 몰랐고 ASC가 아닌 것에 대해 불평했습니다.II 캐릭터.인코딩을 알게 되면 바이트 문자열은 디스크에 실제로 있는 바이트를 얻습니다.유니코드 문자열의 경우 Python은 \x81을 읽고 cp437에서 ü임을 알고 U+00FC인 ü에 대한 유니코드 코드 포인트로 디코딩했습니다.바이트 문자열이 인쇄되었을 때, Python은 16진수 값을 보냈습니다.81
콘솔에 직접 연결합니다.유니코드 문자열이 인쇄되었을 때 Python은 내 콘솔 인코딩을 cp437로 올바르게 감지하고 유니코드 ü를 ü의 cp437 값으로 변환했습니다.
UTF-8에 선언 및 저장된 파일의 경우 다음과 같습니다.
├╝ber '\xc3\xbcber'
über u'\xfcber'
UTF-8에서 ü는 16진수 바이트로 인코딩됩니다.C3 BC
따라서 바이트 문자열에 해당 바이트가 포함되지만 유니코드 문자열은 첫 번째 예제와 동일합니다.Python은 두 바이트를 읽고 올바르게 디코딩했습니다.파이썬은 ü를 나타내는 두 개의 UTF-8 바이트를 내 cp437 콘솔로 직접 전송했기 때문에 바이트 문자열을 잘못 인쇄했습니다.
여기서 파일은 cp437로 선언되지만 UTF-8에 저장됩니다.
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
디스크에서 이바이자디스서에여크전다진바받니았이를, UTF-8 16바수이트습트히).C3 BC
하지만 UTF-8 인코딩 문자가 아닌 두 개의 cp437 문자로 해석되었습니다.유니코드 코드 포인트로 변환된 두 문자는 모두 잘못 인쇄됩니다.
이것은 문자열의 형식을 설정하는 것이 아니라 파일의 형식을 설정합니다.그 머리말이 있어도,"hello"
유니코드 문자열이 아닌 바이트 문자열입니다.▁to▁를 사용해야 합니다.u"hello"
온통.헤더는 다음을 읽을 때 어떤 형식을 사용해야 하는지에 대한 힌트일 뿐입니다..py
java.
헤더 정의는 런타임에 결과 문자열이 아닌 코드 자체의 인코딩을 정의하는 것입니다.
utf-8 헤더 정의를 사용하지 않고 파이썬 스크립트에 ascii와 같은 문자를 넣으면 경고가 발생합니다.
변수를 변환할 수 있도록 유니코더라는 모듈을 만들었습니다.
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'>
언급URL : https://stackoverflow.com/questions/3170211/why-declare-unicode-by-string-in-python
'programing' 카테고리의 다른 글
"요청한 PHP 확장자 bcmath가 시스템에 없습니다." (0) | 2023.07.25 |
---|---|
ORA-01031: 패키지 생성 시 권한 부족 (0) | 2023.07.25 |
루프에 대한 JavaScript ES6 약속 (0) | 2023.07.25 |
C에서 문자열 반전 (0) | 2023.07.25 |
Angular 빌드 및 실행 방법 (0) | 2023.07.25 |