19

MySQL の utf8 は 4 バイト文字をサポートしていないため、Ruby の文字列から 4 バイトの utf8 文字を検出して除去する方法を探しています。テーブルを更新して utf8m4 を使用できることは理解していますが、いくつかの理由でそれが不可能であるか、望ましい解決策ではありません。

文字列を単純に ASCII にエンコードすると、これらの文字が削除されますが、他のすべての非 ASCII 文字も削除されるため、これは適切ではありません。

4

2 に答える 2

35

以下は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'
于 2013-05-10T17:31:33.533 に答える
1

別のオプション (ruby 2.7 でテスト済み) は、gsub で正規表現を使用することです。

input = "hello \xF0\xA9\xB6\x98 world"    # includes U+29D98
input.gsub(/[\u{10000}-\u{10FFFF}]/, "?") # 'hello ? world'
于 2021-07-10T01:47:31.560 に答える