我正在尝试过滤python 3字符串,以便只保留3个字节或更少字节的utf8字符(我写的是一个只需3个字节或更少的utf8_general_ci的SQL数据库)。在Python中有一种直接的方法吗?任何帮助都将非常感激。
答案 0 :(得分:0)
从BMP开始,在其外部进行过滤。
''.join(c for c in S if c < '\U00010000')
答案 1 :(得分:0)
Unicode代码点等于且小于0xffff
被编码为3个或更少的字节(以上,它需要4个字节)。
这样:
''.join(c for c in my_string if ord(c) <= 0xffff)
我不确定Ignacio解决方案是否更快:我的函数更多(对于每个字符)(ord
),但<
只是整数比较。在另一个解决方案中,它应该进行字符串比较,这可能(但不确定)是复杂的。
我对Ignacio解决方案不喜欢的是在字符串上使用<
。文档说“ lexicographic ”排序,但单词(英文)对单词有另一种含义。 Sso in python'&lt;'在字符串上通常是一个错误,但在这种情况下不是。我认为这是Python设计中的少数错误之一('B' < 'a'
,真的吗?)。我的解决方案的意图是(IMO)更清楚。
答案 2 :(得分:0)
谢谢Giacomo Catenazzi。答案是: ''。join(如果ord(c)&lt; = 0xffff,则为my_string中的c;
替代答案 ''。join([_ for my_string中的_如果len(_。encode('utf-8'))&lt; = 3]) 运行速度是''.join的一半(如果是ord(c)&lt; = 0xffff,那么c为my_string中的c。)