【问题标题】:Print a unicode string versus printing each characters, what doesn't it match?打印一个 unicode 字符串与打印每个字符,它不匹配什么?
【发布时间】:2012-09-11 01:47:35
【问题描述】:
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'

【问题讨论】:

    标签: python unicode utf-8 utf-16 utf8-decode


    【解决方案1】:

    您在 UCS2 Python 版本中打印 4 字节 Unicode 字符,这些字符在内部存储为每个字符 2 个,UTF-16 surrogate pair。副作用之一是 \uffff 以上的任何 Unicode 字符都被打印为这样的对;前导字符是\uD800\uDBFF 之间的值,后跟\uDC00\uDFFF 范围内的第二个字符。

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

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

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

    【讨论】:

    • 所以大多数 Python 构建实际上不可能有 unicode 具有任意代码点的对象?
    • @Kos:他们可以,但是他们使用 2 个 UTF-16 字符来表示这些,使长度加倍。不支持正则表达式。
    • @Kos:也就是说,正则表达式不支持\Uffffffff 转义,但您可能会想出一些适合 UTF-16 代理对的东西。不过,把这些做对是一种(皇家)痛苦。
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多