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.
Wie lauten die Python-Versionsnummern? –
Kurze Version: UCS-4 vs UTF-16-Codierung. – Max
Python 2.6.6. Und ehrlich gesagt möchte ich die Beziehung zwischen '\ U0001f649' und' \ uud83d' + '\ ude49' wissen, und wie funktioniert es? – Shane