2017-12-27 19 views
1

:이 그림이 Windows (파이썬)에서 2의 len을 갖는 이유는 무엇입니까? 창에

>>> a = u'\U0001f649' 
>>> print a 

>>> len(a) 
1 
>>> a[0] 
u'\U0001f649' 

어떻게 \U0001f649 와서는 창문에 \ud83d\ude49로 변환된다 : 리눅스에

>>> a = u'\U0001f649' 
>>> print a 

>>> len(a) 
2 
>>> a[0] 
u'\ud83d' 
>>> a[1] 
u'\ude49' 

? 그리고 누군가는 철저하게 그들 사이의 모든 관계/연결을 설명 할 수 있습니까? 또한 Linux에서 \U0001f649\ud83d\ude49으로 변환하는 방법은 무엇입니까?

P. :이 두 버전이 서로 다른 기본 인코딩으로 컴파일되어 있기 때문에 두 파이썬 2.6.6

Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32 

Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
+1

파이썬 버전 번호는 무엇입니까? –

+1

짧은 버전 : UCS-4 대 UTF-16 인코딩. – Max

+0

파이썬 2.6.6. 그리고 솔직히'\ U0001f649'와'\ ud83d' +'\ ude49' 사이의 realtionship을 알고 싶습니다. 어떻게 작동합니까? – Shane

답변

4

이가이다. Windows 버전은 내부적으로 UTF-16을 사용하고 Linux 버전은 UCS-4/UTF-32를 내부적으로 사용합니다.

창에

및 OSX :

당신은 차이를 볼 수는 1,114,112을 얻을 것이다, 리눅스에

>>> import sys 
>>> sys.maxunicode 
65535 

을, 나는 생각한다.

이것은 각 문자가 Windows에서 2 바이트, Linux에서 4 바이트를 차지한다는 것을 의미합니다. 문자가 맞지 않으면 65536보다 높기 때문에 UTF-16으로 인코딩됩니다. 귀하의 질문에 대한

, 당신이 수행하여 두 개의 서로 다른 인코딩을 볼 수에 해당

[UTF-16] 
>>> a = u'\U0001f649' 
>>> [hex(ord(x)) for x in a.encode('utf-16be')] # UTF-16, Big Endian 
['0xd8', '0x3d', '0xde', '0x49'] 

을 \ ud83d \ ude49, Windows에서 보는 바와 같이합니다.

[UTF-32] 
>>> [hex(ord(x)) for x in a.encode('utf-32be')] # UTF-32, Big Endian 
['0x0', '0x1', '0xf6', '0x49'] 

Linux에서 볼 수있는 것과 같이 \ U0001F649에 해당합니다.

Wikipedia은 UTF-16에 대해 상당히 광범위한 기사가 있지만 기본적으로 코드 공간의 일부는 따로 설정되어 있으며 전체 20 비트 수의 10 비트가 각 단어로 인코딩됩니다.

보조 노트로, 이후 버전의 Python 3은이 모든 것을 제거합니다. 모든 문자열을 컴파일 시간 옵션에 따라 16 비트 또는 32 비트가 아닌 각 문자열은 문자열의 가장 큰 문자에 따라 8 비트, 16 비트 또는 32 비트입니다. 이것은 프로그램에서 대부분의 문자열이 ASCII 또는 Basic Multilingual Plane 인 경우보다 훨씬 효율적입니다.

+0

두 개의'encode' 호출은 기본 내부 표현에 관계없이 동일한 결과를 제공하지 않을까요? –

+0

네, 그는 하나에서 다른 것으로 바꾸는 법을 물었고, 그래서 시범을했습니다. – Max