补充代码点到python中的unicode字符串

时间:2012-02-14 21:08:51

标签: python unicode python-2.x supplementary

在没有unichr(0x10000)的情况下编译cpython时,

ValueError失败并显示--enable-unicode=ucs4

是否有内置语言或核心库函数将任意unicode标量值或代码点转换为unicode字符串,无论程序运行的是什么类型的python解释器,该字符串都能正常工作?

1 个答案:

答案 0 :(得分:8)

是的,你走了:

>>> unichr(0xd800)+unichr(0xdc00)
u'\U00010000'

要理解的关键点是unichr()在Python解释器的字符串编码中将整数转换为单个代码单元。 The Python Standard Library documentation for 2.7.3, 2. Built-in Functions, on unichr()读取,

  

返回Unicode字符串一个字符,其Unicode代码是整数i ....参数的有效范围取决于Python的配置方式 - 它可能是UCS2 [0..0xFFFF ]或UCS4 [0..0x10FFFF]。否则会提出ValueError

我强调“一个角色”,他们的意思是"one code unit" in Unicode terms

我假设你使用的是Python 2.x. Python 3.x解释器没有内置的unichr()函数。相反,The Python Standard Library documentation for 3.3.0, 2. Built-in Functions, on chr()读取,

  

返回表示字符的字符串,其Unicode代码点是整数i ....参数的有效范围是0到1,114,111(基数为16的0x10FFFF)。

请注意,返回值现在是一个未指定长度的字符串,而不是具有单个代码单元的字符串。因此,在Python 3.x中,chr(0x10000)将按预期运行。它“将任意unicode标量值或代码点转换为unicode字符串,无论程序运行的是什么类型的python解释器,它都能正常工作”。

但回到Python 2.x.如果使用unichr()创建Python 2.x unicode对象,并且使用的是高于0xFFFF的Unicode标量值,那么您将提交代码以了解Python解释器的{{1}实现对象。

您可以使用在标量值上尝试unicode,捕获unichr()并再次尝试使用相应的UTF-16代理对的函数来隔离此感知:

ValueError

但您可能会发现将标量转换为UTF-32字节def unichr_supplemental(scalar): try: return unichr(scalar) except ValueError: return unichr( 0xd800 + ((scalar-0x10000)//0x400) ) \ +unichr( 0xdc00 + ((scalar-0x10000)% 0x400) ) >>> unichr_supplemental(0x41),len(unichr_supplemental(0x41)) (u'A', 1) >>> unichr_supplemental(0x10000), len(unichr_supplemental(0x10000)) (u'\U00010000', 2) 中的4字节UTF-32值更容易,并将此字节string解码为string字符串:

unicode

上面的代码在Python 2.6.7上测试,UTF-16编码用于Unicode字符串。我没有在Python 2.x解释器上使用UTF-32编码对Unicode字符串进行测试。但是,它应该在任何带有任何Unicode字符串实现的Python 2.x解释器上保持不变。