Railsで人名が入ったCSVをopenする時のencodingはShift_JISではなくcp932にすべし!

こんにちは!kossyです!




さて、今回はRailsで人名が入ったCSVをopenする時のencodingはShift_JISではなくcp932にすべし、
という自戒を込めた備忘録をブログに残してみたいと思います。




環境
Ruby 2.6.3
Rails 6.0.3
MacOS Mojave



Shift_JISとcp932の違いについて

・CP932 は、Shift_JIS の独自実装
・符号化文字集合がいろいろ拡張されている
・拡張文字の有無で、Shift_JIS と判別可能

出典: https://qiita.com/kasei-san/items/cfb993786153231e5413


以下サイトも独自実装の経緯を図解しておりためになりました。

http://una.soragoto.net/topics/13.html

ここではShift_JISの符号化等の仕組みは説明しませんが、
要はShift_JISでは判別できない文字が存在するという事です。


旧字に悩まされる

「﨑」という字を含んだCSVファイルを作成しようとしたところ、
Encoding::UndefinedConversionErrorが発生して処理が中断してしまう事案がありました。

参考: https://docs.ruby-lang.org/ja/latest/class/Encoding=3a=3aUndefinedConversionError.html

これは「﨑」という字がShift_JISエンコードできずに発生したエラーでした。
https://www.kawa.net/works/jcode/uni-escape.html

そのため、Shift_JISではなくcp932をencodingに指定したところ、問題なく作成ができました。

このように、Shift_JISでは旧字に対応できない場合があるため、人名や地名が含まれるCSVを作成する場合は、
文字コードにcp932を指定することをお勧めします。



参考にさせていただいた記事
Shift_JIS に含まれない文字をエスケープ (Jcode.pm編)
Microsoftコードページ932 - Wikipedia
Shift_JIS、CP932、MS932、Windows-31J(文字コード関連) | 読み物 | ウナのIT資格一問一答
本当は怖くないCP932 - Qiita
class Encoding::UndefinedConversionError (Ruby 2.7.0 リファレンスマニュアル)
本当は怖くないCP932 - Qiita