対象:
CRuby
JRuby

文字コードを変換する

Rubyで文字コードを変換するにはKconvライブラリを用いるのが最も簡単だろう。kconvをrequireすると、任意のStringオブジェクトに対してtoutf8、toeuc、及びtosjis等の文字コード変換メソッドが使用できるようになる。

require "kconv"
$KCODE = "UTF8"

s1 = "abc:123 日本語のテキスト".toeuc # EUCに変換

p Kconv.guess(s1) # s1がEUCの場合は2
p s1.toutf8 # 文字コードを自動判定してUTF-8に変換
p Kconv.toutf8(s1) # このように書くこともできる

ただし、toメソッドではinvalid encodingでうまく変換できない場合が往々にしてある。これはkconvメソッドでin_code引数にKconv::AUTOを指定した(あるいはin_codeを指定しない)場合も同じであるから、toutf8とkconv(Kconv::UTF8, Kconv::AUTO)は恐らく等価なのだろう。

require "kconv"
$KCODE = "UTF8"

s1 = "abc:123 日本語のテキスト".toeuc # EUCに変換

p s1.kconv(Kconv::UTF8) # invalid encodingになる
p Kconv.kconv(s1, Kconv::UTF8) # 上と等価
p s1.kconv(Kconv::UTF8, Kconv.guess(s1)) # これだとうまくいく場合がある

同じkconvメソッドを使う場合でも、in_code引数にKconv::AUTOではなく、guessメソッドの戻り値を渡すと自動変換がうまくいく場合があるのこれを利用してみるのも手だろう。

更に文字コードの変換方法を詳細に指定したい場合はNKFライブラリを用いる方法もある。変換元の文字コードと変換先の文字コードが予め分かっている場合は、それをnkfメソッドのオプションで指定して変換を行う。NKF.guess1メソッドで文字コードの判定をすることもできる。

require "nkf"
$KCODE = "UTF8"

s1 = NKF.nkf("-e", "abc:123 日本語のテキスト")
if NKF.guess(s1) == NKF::EUC
  p "EUC"
  p NKF.nkf("-Ew", s1) # オプションは1つにまとめられる
end

nkfメソッドで指定できる主なオプションは以下である。

オプション意味
-e出力エンコーディングはEUC-JP
-s出力エンコーディングはShift_JIS
-w出力エンコーディングはUTF-8
-E入力エンコーディングはEUC-JP
-S入力エンコーディングはShift_JIS
-W入力エンコーディングはUTF-8
-x半角カナを全角カナに変換しない
-X半角カナを全角カナに変換する(デフォルト)
library kconv
library nkf
(2010/07/09)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]