【问题标题】:Filter Python String to utf8 character of bytes 3 or less将 Python 字符串过滤为字节 3 或更少的 utf8 字符
【发布时间】:2018-10-05 09:17:55
【问题描述】:

我正在尝试过滤 python 3 字符串,以便只保留 3 个字节或更少的 utf8 字符(我正在写入一个 utf8_general_ci 的 SQL 数据库,它只能占用 3 个字节或更少)。有没有一种简单的方法可以在 Python 中做到这一点?任何帮助将不胜感激。

【问题讨论】:

    标签: python-3.x utf-8 utf


    【解决方案1】:

    因为BMP,在它外面过滤。

    ''.join(c for c in S if c < '\U00010000')
    

    【讨论】:

      【解决方案2】:

      Unicode 代码点等于且小于0xffff 被编码为 3 个或更少字节(超过此值,它需要 4 个字节)。

      所以:

      ''.join(c for c in my_string if ord(c) <= 0xffff)
      

      我不确定 Ignacio 解决方案是否更快:我有更多函数(对于每个字符)(ord),但 &lt; 只是整数比较。在另一个解决方案中,它应该进行字符串比较,这可能(但不确定)很复杂。

      我不喜欢 Ignacio 解决方案是在字符串上使用 &lt;。文档说“lexicographic”排序,但是单词上的这样的单词(英文)具有其他含义。字符串上的 python ''B' < 'a',真的吗?)。我的解决方案的意图(IMO)更清晰。

      【讨论】:

      • 非常感谢 Giamcomo 。您对使用的想法是什么: ''.join([_ for _ in my_string if len(_.encode('utf-8'))
      • 是的。 “编码”需要检查大小,以便编码(+各种移位运算符)。内部 python 表示不是 UTF-8 [但如果完整的字符串是 ASCII]。实际上,在内部,python 有一系列代码点,根据较大的代码点,它们以 1、2 或 4 个字节表示。 [所以实际上是 UTF-8、UTF-16、UTF-32,但只是为了简单的情况,否则它将传递给下一个编码]
      【解决方案3】:

      谢谢贾科莫·卡泰纳齐。答案是: ''.join(c for c in my_string if ord(c)

      其他答案 ''.join([_ for _ in my_string if len(_.encode('utf-8'))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 1970-01-01
        • 2012-07-17
        • 2014-01-29
        相关资源
        最近更新 更多