久保清隆のブログ

ライフハック、健康、旅行など、役立つ情報を書きます。

文字コードの変換方法まとめ 〜Rubyで文字化けした時の対応方法

Ruby(1.8.6)で文字コードを変換したかった。


Ruby文字コードを変換するには、

    • kconvを利用する方法
    • nkfを利用する方法
    • iconvを利用する方法

の3つがある。


csvダウンロードするために、utf-8sjisに変換する必要があった。

kconvを用いる方法


Kconvは自動的に、MIMEをデコードしたり、半角カタカナを全角カタカナに変換したりする。
このような動作を好まない場合は、NKF モジュールを直接用いる必要がある。
ちなみに、Kconvは内部ではNKFを用いて変換を行っている。


kconvを使うのが一番手軽そうだったので、
コントローラでrequire 'kconv'して、
kconvのtosjisを使ってたら基本的にうまくいってたんだけど、
國とか學とかの旧字体の変換で文字化けした。

require 'kconv'
'学'.tosjis #=> '学'
'學'.tosjis #=> 文字化け


文字コード変換には、入力された文字の文字コードを認識し、指定の文字コードへ変換する。
入力のとき、tosjisは文字コードを自動判定しているんだけど、誤判定が多いらしい。
だから、入力の時の文字コードを指定する必要がある。

require 'kconv'
'学'.kconv(Kconv::SJIS,Kconv::UTF8) #=>'学'
'學'.kconv(Kconv::SJIS,Kconv::UTF8) #=>'學'

うまくいくようになった。

ちなみに、他の文字コードの場合は以下。
strは何らかの文字列とする。

変換前コード 変換後コード 自動判定 入力文字コードを指定
EUC-JP Shift_JIS str.tosjis str.kconv(Kconv::SJIS, Kconv::EUC)
EUC-JP JIS str.tojis str.kconv(Kconv::JIS, Kconv::EUC)
Shift_JIS EUC-JP str.toeuc str.kconv(Kconv::EUC, Kconv::SJIS)
EUC-JP UTF-8 str.toutf8 str.kconv(Kconv::UTF8, Kconv::EUC)
EUC-JP UTF-16 str.toutf16 str.kconv(Kconv::UTF16, Kconv::EUC)

nkfを用いる方法


ものすごく古い漢字コード変換プログラムであるnkfRubyから用いるためのライブラリ。
ruby1.8.2 からnkf 2.0ベースになったため、 Unicode 系の変換に対応した。


次にnkfを使ってみた。
nkfを使う場合でも、入力時の文字コードを自動判定にすると、文字化けする。

require 'nkf'
NKF.nkf('-s','学') #=> '学'
NKF.nkf('-s','學') #=> 文字化け


というわけで、入力時の文字コードを指定。

require 'nkf'
NKF.nkf('-W -s','学') #=> '学'
NKF.nkf('-W -s','學') #=> '學'

うまくいった。

ちなみに、他の文字コードの場合は以下。

変換前コード 変換後コード 自動判定 入力文字コードを指定
UTF-8 Shift_JIS NKF.nkf('-s', str) NKF.nkf('-W -s', str)
EUC-JP JIS NKF.nkf('-j', str) NKF.nkf('-E -j', str)
Shift_JIS EUC-JP NKF.nkf('-e', str) NKF.nkf('-S -e', str)
JIS UTF-8 NKF.nkf('-w', str) NKF.nkf('-J -w', str)

参考ページ

Rubyist Magazine - 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv



お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。
ブログランキング・にほんブログ村へにほんブログ村 IT技術ブログへにほんブログ村 IT技術ブログ プログラム・プログラマへ人気ブログランキングへ