我在Windows上有一个简单的Python 2.7.6版本。我还有一个包含“narrow”(< 0x10000)和“wide”(> 0xFFFF)Unicode代码点的字符串。
>>> wide1 = u'\U0002b740'
>>> wide2 = u'\ud86d\udf40'
>>> wide1 == wide2
True
>>> narrow = u'\ud86d'
>>> s = wide1 + narrow
但是当我遍历字符串时,它无法识别宽代码点:
>>> for c in s:
>>> c
u'\ud86d'
u'\udf40'
u'\ud86d'
并且无法确定char是一个狭窄的代码点还是广泛代码点的一部分。
答案 0 :(得分:1)
你做不到。高Unicode代码点在内部表示为UTF-16代理。
U + D86D和U + DF40代码点是这样的代理,无论如何你都不应该在正常的Unicode文本用法中看到这一点。引自Wikipedia article on UTF-16:
Unicode标准永久保留这些代码点值,用于引导和跟踪代理的UTF-16编码,并且永远不会为它们分配字符,因此没有理由对它们进行编码。官方的Unicode标准说没有UTF格式,包括UTF-16,可以编码这些代码点。
因此,U + D800到U + DFFF代码点不应被视为窄点;它们是宽代码点的一半,这就是它们的目的。