如何在 Ruby 中删除 4 字节的 UTF-8 字符?

21

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

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

2个回答

37

以下代码在 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'

谢谢!现在看起来很明显,你建议后我才想到。我太深入地考虑编码问题了,没有想到简单地查看每个字符的字节计数。 - JZC
这个在处理长字符串时的性能如何?5000个字符以上呢? - Arnold Roa
谢谢谢谢谢谢……目前我个人不太担心性能问题,我很高兴有一个可用的解决方案。 - steve
那样做根本不高效,是否有其他方法可以做到呢? - raquelhortab

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接