RailsでSJISのエクスポートを行うときにテンプレート側で出るこのエラー。
そもそもUTF8でエクスポートさせてよと思うのですが、CSVファイルをExcelで見れるようにしてねという依頼がある限りSJISエクスポートはなくならないのでしょう。
主にあるSJIS変換時にエラーとなる文字コードは以下など。
文字コード(UTF-8) | 文字 | 備考 |
U+00F8 | Ø | Oにストロークが付いたラテン文字 |
U+00A2 | ¢ | セント記号(通貨) |
U+00A3 | £ | ポンド記号(通貨) |
U+00AC | ¬ | NOT記号 |
U+2013 | – | 短いenダッシュ |
U+2014 | — | 長いemダッシュ |
U+2016 | ‖ | DOUBLE VERTICAL LINE |
U+203E |  ̄ | オーバーライン |
U+2212 | − | ハイフンマイナス |
U+203A | › | SINGLE RIGHT |
U+301C | 〜 | 波ダッシュ |
個別にlibなどに関数を作って対応させていたりしたのですが、やや煩雑になったり。
その時に見つけたのがこちらの記事です。
★参考記事
https://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018
確かに一旦、全てをSJISからUTFに変換し、それをSJISに戻せばエラーは出ない。
かなり見事な変換だったのと、Stringクラスへ拡張を行なっているので使いやすい使いやすい。
そして、やや置き場所に悩むStringなどのコアクラスへの派生クラスの置き場所。
「lib」配下に置くというのもアリですが、「core_ext」などのコアクラスの置き場を用意してそこで実施していくというのが管理的にも良さそうですね。
ファイル的には以下になるかと。
1 2 3 |
Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class String def sjisable str = self #変換テーブル上の文字を下の文字に置換する from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}" to_chr = "\u{FF5E FF0D FFE0 FFE1 FFE2 FF0D 2015 2225 FFE3 0020 03A6 3009}" str.tr!(from_chr, to_chr) #変換テーブルから漏れた不正文字は?に変換し、さらにUTF8に戻すことで今後例外を出さないようにする str = str.encode("Windows-31J","UTF-8",:invalid => :replace,:undef=>:replace).encode("UTF-8","Windows-31J") end end |
使い方は文字列に対して「sjisable」メソッドを適用するだけなので使い勝手が非常に高いです。
1 2 3 |
@sjis_string = string.sjisable |
さらっと便利さ抜群です。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。
お問い合わせやご依頼・ご相談など