python2 如何正确的处理 4 字节的字符,为什么一个字符变成了两个?

2016-01-21 19:10:12 +08:00
 zeroten
x = u'\U0001f604abc'

print('length:',len(x))
for i in x:
    print(i)

得到输出:

('length:', 5)


a
b
c

x 是 4 个字符,其中第一个是 4 字节字符,一个笑脸表情的 unicdoe 码,现在显然被拆分成了两个。我写的过滤函数就过滤失败了:

def filter_invalid_str(text):
return ''.join(map(lambda x: x if u'\u0000' < x < u'\uFFFF' else '_', text))

所以,明明一个字符为什么变成了两个,如何当作一个字符处理?

2815 次点击
所在节点    Python
8 条回复
Zzzzzzzzz
2016-01-21 19:19:55 +08:00
编译 python2 的时候加上--enable-unicode=ucs4
Hackathon
2016-01-21 19:39:21 +08:00
zeroten
2016-01-21 19:41:45 +08:00
或者,过滤掉 u'\u0000' < x < u'\uFFFF'之外的字符有什么好的实现方法?
zeroten
2016-01-21 19:50:40 +08:00
@Zzzzzzzzz 这个编译是指?编译 python 的 C 源码么?
Hackathon
2016-01-21 19:56:02 +08:00
Hackathon
2016-01-21 19:56:08 +08:00
Zzzzzzzzz
2016-01-21 20:00:46 +08:00
@zeroten 对, 你现在是 ucs2.
zeroten
2016-01-21 20:07:16 +08:00
@Hackathon
@Zzzzzzzzz

很好奇为什么落在[\uD800-\uDBFF][\uDC00-\uDFFF]这个范围内

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX