2
s = u'\U0001031e\U0001031d\U0001015c\U0001015d\U00010170\U0001014b\U00010169\U0001016a\U0001016c\xa6\U0001d32c\U0001010c\U0001013a\U00010109\U0001010b\U0001010d\U0001010f\U0001011c\U0001d1ca\U000201b3\U0001016d\U00010184\U00010184'
print s
for a in s: print a, repr(a)

我使用 mac os x lion,python 272,字符串打印正常,但循环打印 '???' 以及不正确的 u'\u' unicode 值。

这是打印的值:

u'\ud800' u'\udf1e' u'\ud800' u'\udf1d' u'\ud800' u'\udd5c' u'\ud800' u'\udd5d' u'\ud800' u'\udd70' u'\ud800' u'\udd4b' u'\ud800' u'\udd69' u'\ud800' u'\udd6a' u'\ud800' u'\udd6c' u'\xa6' u'\ud834' u'\udf2c' u'\ud800' u'\udd0c' u'\ud800' u'\udd3a' u'\ud800' u'\udd09' u'\ud800' u'\udd0b' u'\ud800' u'\udd0d' u'\ud800' u'\udd0f' u'\ud800' u'\udd1c' u'\ud834' u'\uddca' u'\ud840' u'\uddb3' u'\ud800' u'\udd6d' u'\ud800' u'\udd84' u'\ud800' u'\udd84'
4

1 回答 1

4

您正在 UCS2 Python 构建中打印 4 字节 Unicode 字符,这些字符在内部存储为每个 2 个字符,一个UTF-16 代理对。副作用之一是上面的任何 Unicode 字符\uffff都被打印成这样的对;前导字符是一个介于to范围内的值\uD800\uDBFF后跟第二个字符。\uDC00\uDFFF

您需要重新编译您的 python 以支持宽 Unicode 字符,或升级到 python 3.3,它具有新的内部 Unicode 表示,可根据需要在 1、2 和 4 字节宽字符之间切换。

您可以通过查看来测试您的 python unicode 支持sys.maxunicode;如果该系统值等于65535您的窄(默认)构建,则在宽构建中该值为 1114111。

Mac 的默认 python 是窄的 Unicode 构建;最新的 Linux 发行版启用了宽 unicode 标志。

于 2012-09-18T18:47:07.420 回答