如何在 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 字符的字符串

Ruby - 肥皂和字节数组的摘要认证

ruby 1.9:UTF-8 中的无效字节序列

Ruby/Rails CSV 解析,UTF-8 中的无效字节序列

Paypal IPN:UTF-8 中的无效字节序列