【问题标题】:How to remove 4 byte utf-8 characters in Ruby?如何在 Ruby 中删除 4 字节 utf-8 字符?
【发布时间】:2013-05-05 11:01:03
【问题描述】:

由于 MySQL 的 utf8 不支持 4 字节字符,我正在寻找一种方法来检测和消除 Ruby 中字符串中的任何 4 字节 utf8 字符。我知道我可以更新我的表以使用 utf8m4,但由于几个原因,这是不可能的或所需的解决方案。

简单地将字符串编码为 ASCII 会删除这些字符,但也会删除所有其他非 ASCII 字符,这是不好的。

【问题讨论】:

    标签: ruby utf-8 character-encoding utf8mb4


    【解决方案1】:

    另一个选项(在 ruby​​ 2.7 中测试)是使用带有 gsub 的正则表达式:

    input = "hello \xF0\xA9\xB6\x98 world"    # includes U+29D98
    input.gsub(/[\u{10000}-\u{10FFFF}]/, "?") # 'hello ? world'
    

    【讨论】:

      【解决方案2】:

      以下似乎在 Ruby 1.9.3 中对我有用:

      input.each_char.select{|c| c.bytes.count < 4 }.join('')
      

      例如:

      input = "hello \xF0\xA9\xB6\x98 world"                  # includes U+29D98
      input.each_char.select{|c| c.bytes.count < 4 }.join('') # 'hello  world'
      

      【讨论】:

      • 谢谢!既然你已经建议了,这似乎很明显。我对编码的思考如此之深,以至于我没有想到简单地查看每个字符的字节数。
      • 这个长字符串的表现如何? 5000 多个字符?
      • 谢谢谢谢谢谢……我个人并不担心性能,目前我很高兴有一个可行的解决方案
      • 这根本没有效率,有没有其他方法可以做到这一点?
      猜你喜欢
      • 2012-03-04
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2019-09-17
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多