コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyで特定の文字コードにて変換できない文字を消したいときは encodeでオプションを駆使すると消せる

明示的に歯抜けにさせるというコマンドはないが、あわせ技でできる

環境

$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

やり方

encode メソッドにはオプションとして未定義なものはリプレースする :undef => :replace というオプションと :replace => {{変えたい文字列}} ということができるので、変えたい文字列を指定する。

UTF-8からSHIFTJISに変換し、ない文字は消すことを想定する。 UTF-8にしかない文字列を用意するが、今回は以下のページを参考にした。

参考:文字エンコーディングを変換するとき、対応していない文字を数値実体参照に変換する - Qiita

p text
# "ホッケの漢字は𩸽"
# SHIFT_JISに変換
shift_jis_text = text.encode("Shift_JIS", :undef => :replace, :replace => "")
# 試しにUTF-8に戻す
reverse_utf8_text = shift_jis_text.encode("UTF-8")
#  戻した文字数を比べると減っている
p "#{text.size} : #{reverse_utf8_text.size}"
# "9 : 8"

参考