How is unicode represented internally in Python?

给你一囗甜甜゛ 提交于 2019-11-26 09:48:37

问题


How is Unicode string literally represented in Python\'s memory?

For example I could visualize \'abc\' as its equivalent ASCII bytes in Memory. Integer could be thought of as the 2\'s compliment representation. However u\'\\u2049\', even though is represented in UTF-8 as \'\\xe2\\x81\\x89\' - 3 bytes long, how do I visualize the literal u\'\\u2049\' codepoint in the memory?

Is there a specific way it is stored in memory? Does Python 2 and Python 3 treat it differently?

Few related questions for anyone curious :

1) How are these strings represented internally in Python interpreter ? I don't understand

2) What is internal representation of string in Python 3.x


回答1:


I'm assuming you want to know about CPython, the standard implementation. Python 2 and Python 3.0-3.2 use either UCS2* or UCS4 for Unicode characters, meaning it'll either use 2 bytes or 4 bytes for each character. Which one is picked is a compile-time option.

\u2049 is then represented as either \x49\x20 or \x20\x49 or \x49\x20\x00\x00 or \x00\x00\x20\x49 depending on the native byte order of your system and if UCS2 or UCS4 was picked. ASCII characters in a unicode string still use 2 or 4 bytes per character too.

Python 3.3 switched to a new internal representation, using the most compact form needed to represent all characters in a string. Either 1 byte, 2 bytes or 4 bytes are picked. ASCII and Latin-1 text uses just 1 byte per character, the rest of the BMP characters require 2 bytes and after that 4 bytes is used.

See PEP-393: Flexible String Representation for the full low-down on these representations.


* Technically speaking the UCS-2 build uses UTF-16, as non-BMP characters use UTF-16 surrogates to encode to 4 bytes (2 UTF-16 characters) each. However, Python documentation still refers to this as UCS2.

This does lead to unexpected behaviour such as the len() on non-BMP unicode strings being longer than the number of characters contained.



来源:https://stackoverflow.com/questions/26079392/how-is-unicode-represented-internally-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!