developer's diary

最近はc#のエントリが多いです

rubyで波ダッシュ・全角チルダ問題(utf-8 → EUC-JP)

UTF-8の文字をEUC-JPに変換する際にエラーが発生。

encode': U+FF5E from UTF-8 to EUC-JP (Encoding::UndefinedConversionError)

何が起こってるか調査

問題は波ダッシュ・全角チルダ問題 (wikipedia)でした。

解決方法の調査

UTF-8からShift_JISに変換する時の注意を参考に対応

def eucjp_safe(str)
  [
    ["301C", "FF5E"], # wave-dash
    ["2212", "FF0D"], # full-width minus
    ["00A2", "FFE0"], # cent as currency
    ["00A3", "FFE1"], # lb(pound) as currency
    ["00AC", "FFE2"], # not in boolean algebra
    ["2014", "2015"], # hyphen
    ["2016", "2225"], # double vertical lines
  ].inject(str) do |s, (after,  before)|
    s.gsub(
      before.to_i(16).chr('UTF-8'),
      after.to_i(16).chr('UTF-8'))
  end
end

eucjp_safe("変換に失敗した文字。").encode("eucJP")

以上。