2017-12-27 4 views
1

an Fenstern:Warum hat dieses Emoji eine Länge von 2 auf Windows (Python)?

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

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

Unter Linux:

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

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

Wie kommt \U0001f649-\ud83d und \ude49 auf Fenster umgewandelt wird? Und könnte jemand die ganze Beziehung zwischen ihnen gründlich erklären? Wie konvertiert man \U0001f649 in \ud83d und \ude49 unter Linux?

P.S.: Sowohl auf Python 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

Wie lauten die Python-Versionsnummern? –

+1

Kurze Version: UCS-4 vs UTF-16-Codierung. – Max

+0

Python 2.6.6. Und ehrlich gesagt möchte ich die Beziehung zwischen '\ U0001f649' und' \ uud83d' + '\ ude49' wissen, und wie funktioniert es? – Shane

Antwort

4

Dies liegt daran, diese beiden Versionen mit unterschiedlichen nativen Kodierungen kompiliert werden. Die Windows-Version verwendet intern UTF-16, und die Linux-Version verwendet intern UCS-4/UTF-32.

Sie den Unterschied sehen können:

Unter Windows und OSX:

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

Unter Linux Sie 1.114.112 erhalten werden, denke ich.

Dies bedeutet, dass jedes Zeichen 2 Bytes unter Windows und 4 Bytes unter Linux benötigt. Wenn das Zeichen nicht passt, weil es höher als 65536 ist, wird es in UTF-16 codiert.

Für Ihre Frage, können Sie die zwei unterschiedlichen Codierungen sehen, indem Sie diese:

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

die zu \ entspricht ud83d \ ude49, wie Sie unter Windows zu sehen.

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

Das entspricht \ U0001F649, wie Sie unter Linux sehen.

Wikipedia hat einen ziemlich ausführlichen Artikel über UTF-16, aber grundsätzlich wurde ein Teil des Coderaums beiseite gelegt, und zehn Bits der vollen 20-Bit-Zahl sind in jedem Wort kodiert.

Als eine Nebenbemerkung, spätere Versionen von Python 3 verzichten damit zusammen. Statt dass jede Zeichenkette entweder 16 Bit oder 32 Bit lang ist, hängt dies von der Option der Kompilierzeit ab: Jede Zeichenkette ist 8-Bit, 16-Bit oder 32-Bit abhängig von dem größten Zeichen in der Zeichenkette. Dies ist viel effizienter, da die meisten Strings in einem Programm ASCII oder Basic Multilingual Plane sind.

+0

Würden diese beiden "encode" -Aufrufe nicht die gleichen Ergebnisse liefern, unabhängig von der zugrunde liegenden internen Repräsentation? –

+0

Ja, er fragte, wie man von einem zum anderen wechseln könne, also demonstrierte ich. – Max

Verwandte Themen