2016-10-03 3 views
0
>>> c='中文' 
>>> c 
'\xe4\xb8\xad\xe6\x96\x87' 
>>> len(c) 
6 
>>> cu=u'中文' 
>>> cu 
u'\u4e2d\u6587' 
>>> len(cu) 
2 
>>> s='' 
>>> s 
'\xf0\xa4\xad\xa2' 
>>> len(s) 
4 
>>> su=u'' 
>>> su 
u'\U00024b62' 
>>> len(su) 
2 
>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 
>>> sys.stdout.encoding 
'UTF-8' 

먼저 개념을 분명히하고 싶습니다. cu=u'中文' 같은 유니 코드 문자열은 실제로는 파이썬 쉘 기본값으로 UTF-16으로 인코딩된다는 것을 알게되었습니다. 권리? 그래서 우리가 '\u*'을 볼 때, 실제로는 UTF-16 encoding입니까? '\u4e2d\u6587'은 유니 코드 문자열 또는 바이트 문자열입니까? 그러나 cu 때문에, 메모리에 저장되어야한다len (유니 코드 문자열)

0100 1110 0010 1101 0110 0101 1000 0111 

(변환 \ u4e2d \ u6587 바이너리) 바이트 문자열이 경우 cu 양식 보존된다? 맞습니까?

그러나 바이트 문자열 일 수 없습니다. 그렇지 않으면 len (cu)는 2가 될 수 없으며, 4이어야합니다! 그래서 유니 코드 문자열이어야합니다. 하지만 !!! 내가 암시 계획이 현재 sys.stdout.encoding에 설정되어 무엇 이건 유니 코드 문자열을 인코딩도 learned

그 파이썬 시도를했습니다,이 경우에는 "UTF-8"입니다.

>>> cu.encode('utf-8') 
'\xe4\xb8\xad\xe6\x96\x87' 

그래서! 어떻게 할 수 있냐 len(cu) == 2 ??? 그 안에 두 개의 '\u'이 있기 때문입니까?

하지만 그건 의미가 없습니다. len(su) == 2!

내가 누락 된 항목이 있습니까? 내가 파이썬에게 2.7.12

+0

자! = 바이트. utf16 문자는 2 바이트이지만 단 하나의 문자입니다. –

+0

유니 코드 *를 먼저 읽으 려합니다. http://nedbatchelder.com/text/unipain.html을 참조하십시오. –

+0

@MartijnPieters 감사합니다! 매우 도움이됩니다. – MMMMMCCLXXVII

답변

0

파이썬 unicode 유형을 사용하고

유니 코드을 코드 포인트 보유하고 있으며 인코딩 될 운명이되지 않습니다. 파이썬이 내부적으로 어떻게 구현하는지는 구현 세부 사항이며 대부분의 시간에 대해 염려 할 필요가 없습니다. UTF-16은 UTF-16 코드 단위가 아니기 때문에 UTF-16은 유니 코드 텍스트를 인코딩하는 데 사용할 수있는 또 다른 코덱이므로 UTF-8과 같습니다.

여기에서 가장 중요한 것은 표준 파이썬 str 객체 또는 특정 코덱으로 인코딩 된 텍스트를 보유하지 않을 수있는 바이트을 보유하고 있다는 점이다 (샘플은 UTF-8을 사용하지만, 주어진 아니에요), 그리고 unicode 보유 유니 코드 코드 포인트. 대화 형 인터프리터 세션에서 이것은 사용자의 터미널 코덱으로, 파이썬에서 어떤 바이트를 받았는지를 결정합니다. unicode 오브젝트를 생성 할 때 필요에 따라 이들을 디코딩하기 위해 sys.stdin.encoding을 사용합니다.

경우에만 sys.stdout- 쓰기 (예를 들어, print를 사용하는 경우) 파이썬은 자동으로 다시 유니 코드 문자열을 인코딩 곳, 재생 오는 sys.stdout.encoding 값을한다. 다음으로은 유니 코드 코드 포인트 2 개를 UTF-8로 다시 인코딩하여이를 터미널에 기록합니다.이 코드는이를 해석하는 방법을 알고 있습니다.

당신은 아마 파이썬과 유니 코드에 대한 최대 읽고 싶어, 내가 추천 :

Spolsky 조엘에 의해
+0

다른 질문이 있습니다. 앞에서 언급했듯이,'print'를 사용할 때만 파이썬은 자동으로 유니 코드 문자열을 다시 인코딩합니다. 따라서 bash 쉘은 유니 코드를 다시 받아서 화면에 표시하고 해당 유니 코드를 사용하여 렌더링 된 것과 무언가가 일치하는지 확인하거나 글리프로 남겨 두었습니다. 그래서 단순히 화면에 무엇인가를 표시하고 싶다면 유니 코드가 마지막 형태라고 생각할 수 있습니까? 어, 내 말 좀 들어 줄래? – MMMMMCCLXXVII