unichr(0x10000)
的情况下编译cpython时, ValueError
失败并显示--enable-unicode=ucs4
。
是否有内置语言或核心库函数将任意unicode标量值或代码点转换为unicode
字符串,无论程序运行的是什么类型的python解释器,该字符串都能正常工作?
答案 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解释器上保持不变。