如何在 Ruby 中删除 4 字节 utf-8 字符?
Posted
技术标签:
【中文标题】如何在 Ruby 中删除 4 字节 utf-8 字符?【英文标题】:How to remove 4 byte utf-8 characters in Ruby? 【发布时间】:2013-05-05 11:01:03 【问题描述】:由于 mysql 的 utf8 不支持 4 字节字符,我正在寻找一种方法来检测和消除 Ruby 中字符串中的任何 4 字节 utf8 字符。我知道我可以更新我的表以使用 utf8m4,但由于几个原因,这是不可能的或所需的解决方案。
简单地将字符串编码为 ASCII 会删除这些字符,但也会删除所有其他非 ASCII 字符,这是不好的。
【问题讨论】:
【参考方案1】:另一个选项(在 ruby 2.7 中测试)是使用带有 gsub 的正则表达式:
input = "hello \xF0\xA9\xB6\x98 world" # includes U+29D98
input.gsub(/[\u10000-\u10FFFF]/, "?") # '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 多个字符? 谢谢谢谢谢谢……我个人并不担心性能,目前我很高兴有一个可行的解决方案 这根本没有效率,有没有其他方法可以做到这一点?以上是关于如何在 Ruby 中删除 4 字节 utf-8 字符?的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails“由于bot而导致的UTF-8中无效的字节序列”
Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串