中易网

Python unichr帮助信息有误?怎么处理32位的字符串

答案:1  悬赏:80  
解决时间 2021-01-12 07:24
  • 提问者网友:火车头
  • 2021-01-11 08:52
Python unichr帮助信息有误?怎么处理32位的字符串
最佳答案
  • 二级知识专家网友:底特律间谍
  • 2021-01-11 09:38
unicode和ordinal的转换问题在python2里能通过自定义函数解决。

narrow Python build(使用默认的--enable-unicode=ucs2),虽然它的参数是ucs2,但python内部编码并不是ucs2,是由w_char确定的,一般是utf-16(ucs2无法表示除了基本多语言平面(BMP)的字符,utf-16完全取代了ucs2)。当这个unicode不在BMP时,它是以surrogate pairs的形式保存,所以可以看到

>> u'\U0002F80A'[0]
u'\ud87e'
>>> u'\U0002F80A'[1]
u'\udc0a'

"怎么把0x2f80a转换成u'\U0002F80A' (unichr转换不了) ",这个方法来自于stackoverflow

def unichr_supplemental(scalar):
try:
return unichr(scalar)
except ValueError:
return unichr( 0xd800 + ((scalar-0x10000)//0x400) ) \
+unichr( 0xdc00 + ((scalar-0x10000)% 0x400) )

>>> unichr_supplemental(0x2f80a)
u'\U0002f80a'

"把u'\U0002F80A'转换成0x2f80a"

def ord_supplemental(unichar):
try:
return ord(uc)
except TypeError:
return ((ord(uc[0]) - 0xd800) << 10) + \
+ ord(uc[1]) - 0xdc00 + 0x10000

>>> hex(ord_supplemental(u'\U0002F80A'))
'0x2f80a'

最后一个问题,自定义一个generator

def unicode_generator(us):
i = 0
n = len(us)
while i cur = ord(us[i])
if cur < 0xd800 or cur > 0xdfff:
yield cur
i+=1
else:
yield ((cur - 0xd800) << 10) + \
+ ord(us[i+1]) - 0xdc00 + 0x10000
i+=2

>>> s=u'\U0002F80A\U0002F80B\U0002F80C喵喵123'
>>> for word in unicode_generator(s):
... print word
...
194570
194571
194572
21941
21941
49
50
51
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息