unichr(0x10000)
在未使用--enable-unicode=ucs4
编译的cpython中会产生ValueError
错误。
是否有一种语言内置或核心库函数能够将任意Unicode标量值或代码点转换为unicode
字符串,而无论程序运行在何种类型的python解释器上都能正常工作?
unichr(0x10000)
在未使用--enable-unicode=ucs4
编译的cpython中会产生ValueError
错误。
是否有一种语言内置或核心库函数能够将任意Unicode标量值或代码点转换为unicode
字符串,而无论程序运行在何种类型的python解释器上都能正常工作?
Yes, here you go:
>>> unichr(0xd800)+unichr(0xdc00)
u'\U00010000'
unichr()
将整数转换为Python解释器字符串编码中的单个代码单元。Python标准库文档2.7.3中,2.内置函数的unichr()
描述如下:
我强调了“一个字符”,这意味着Unicode术语中的一个代码单元。返回Unicode代码为整数i的一个字符的Unicode字符串。参数的有效范围取决于Python的配置-它可以是UCS2 [0..0xFFFF]或UCS4 [0..0x10FFFF]。否则会引发
ValueError
。
unichr()
函数。而是2.内置函数的chr()
描述如下:
请注意,返回值现在是未指定长度的字符串,而不是单个代码单元的字符串。因此,在Python 3.x中,返回表示Unicode代码点是整数i的字符的字符串。参数的有效范围是从0到1,114,111(在基数16中为0x10FFFF)。
chr(0x10000)
将按您预期的方式工作。它“将任意Unicode标量值或代码点转换为适用于运行程序的Python解释器类型无关的unicode
字符串”。unichr()
创建Python 2.x unicode
对象,并且使用的Unicode标量值大于0xFFFF,则您正在使您的代码意识到Python解释器对unicode
对象的实现。unichr()
,捕获ValueError
,并使用相应的UTF-16代理项再次尝试: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)
但是你可能会发现,把你的标量转换成UTF-32四字节值放在一个UTF-32字节 string
中,然后将这个字节 string
解码成一个 unicode
字符串更容易:
>>> '\x00\x00\x00\x41'.decode('utf-32be'), \
... len('\x00\x00\x00\x41'.decode('utf-32be'))
(u'A', 1)
>>> '\x00\x01\x00\x00'.decode('utf-32be'), \
... len('\x00\x01\x00\x00'.decode('utf-32be'))
(u'\U00010000', 2)
以上代码在Python 2.6.7上进行了测试,采用UTF-16编码处理Unicode字符串。我没有在Python 2.x解释器中使用UTF-32编码处理Unicode字符串对其进行测试。但是,在任何Python 2.x解释器中使用任何Unicode字符串实现方式都应该能够正常运行。