【发布时间】:2018-10-05 09:17:55
【问题描述】:
我正在尝试过滤 python 3 字符串,以便只保留 3 个字节或更少的 utf8 字符(我正在写入一个 utf8_general_ci 的 SQL 数据库,它只能占用 3 个字节或更少)。有没有一种简单的方法可以在 Python 中做到这一点?任何帮助将不胜感激。
【问题讨论】:
标签: python-3.x utf-8 utf
我正在尝试过滤 python 3 字符串,以便只保留 3 个字节或更少的 utf8 字符(我正在写入一个 utf8_general_ci 的 SQL 数据库,它只能占用 3 个字节或更少)。有没有一种简单的方法可以在 Python 中做到这一点?任何帮助将不胜感激。
【问题讨论】:
标签: python-3.x utf-8 utf
因为BMP,在它外面过滤。
''.join(c for c in S if c < '\U00010000')
【讨论】:
Unicode 代码点等于且小于0xffff 被编码为 3 个或更少字节(超过此值,它需要 4 个字节)。
所以:
''.join(c for c in my_string if ord(c) <= 0xffff)
我不确定 Ignacio 解决方案是否更快:我有更多函数(对于每个字符)(ord),但 < 只是整数比较。在另一个解决方案中,它应该进行字符串比较,这可能(但不确定)很复杂。
我不喜欢 Ignacio 解决方案是在字符串上使用 <。文档说“lexicographic”排序,但是单词上的这样的单词(英文)具有其他含义。字符串上的 python ''B' < 'a',真的吗?)。我的解决方案的意图(IMO)更清晰。
【讨论】:
谢谢贾科莫·卡泰纳齐。答案是: ''.join(c for c in my_string if ord(c)
其他答案 ''.join([_ for _ in my_string if len(_.encode('utf-8'))
【讨论】: