MySQL の utf8 は 4 バイト文字をサポートしていないため、Ruby の文字列から 4 バイトの utf8 文字を検出して除去する方法を探しています。テーブルを更新して utf8m4 を使用できることは理解していますが、いくつかの理由でそれが不可能であるか、望ましい解決策ではありません。
文字列を単純に ASCII にエンコードすると、これらの文字が削除されますが、他のすべての非 ASCII 文字も削除されるため、これは適切ではありません。
MySQL の utf8 は 4 バイト文字をサポートしていないため、Ruby の文字列から 4 バイトの utf8 文字を検出して除去する方法を探しています。テーブルを更新して utf8m4 を使用できることは理解していますが、いくつかの理由でそれが不可能であるか、望ましい解決策ではありません。
文字列を単純に ASCII にエンコードすると、これらの文字が削除されますが、他のすべての非 ASCII 文字も削除されるため、これは適切ではありません。
以下は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'
別のオプション (ruby 2.7 でテスト済み) は、gsub で正規表現を使用することです。
input = "hello \xF0\xA9\xB6\x98 world" # includes U+29D98
input.gsub(/[\u{10000}-\u{10FFFF}]/, "?") # 'hello ? world'