Ruby で日本語文字コードの変換
Ruby を使って,漢字コードの変換を行うプログラム例を示す.
- Windows-31J から UTF-8 へ変換
- UTF-8 から Windows-31J へ変換
* nkf を用いて半角カナを全角に変換, 全角数字を半角に変換するプログラムについては,別の Web ページ で説明している.
日本語文字コードの変換
【要点】
- Ruby バージョン 1.9 以降: String::encode を使う
- Ruby バージョン 1.8 以下: NKF を使う
【Ruby バージョン 1.9 系列の String::encode に関する情報】
- encoding.name_list: エンコーディング名の取得
- String::encodig: エンコード情報の取得
- String::encode: エンコード
Shift_JIS, Windows-31J, UTF-8, iso-2022-jp などを指定できる. - String::force_encodig: エンコーディング情報の設定 (バイナリ文字列である "ASCII-8BIT" に設定するなど)
- String::valid_encoding?: エンコーディング情報が正しいか
【NKF の主要なオプション】
- j,s,e,w: 出力コードは JIS 7 ビット(デフォルト),Shift_JIS, EUC-JP, UTF-8(Byte Order Mark; BOM 無し)
- J,S,E,W: 入力される文字コードとして JIS 7 ビット(デフォルト),Shift_JIS, EUC-JP, UTF-8 を仮定する(自動推定しない)
- -X: 半角カナ (X0201) を全角に変換する (デフォルト)
- -x: 半角カナ (X0201) を半角カナのまま残す
- -m: MIME 文字列をデコードする (デフォルト)
- -m0: MIME 文字列をデコードしない
- Z[0-3]: X0208 alphabet を ASCII に変換
【ソースコード】
「-m0」を入れているのは,nkf の機能である MIME 文字列のデコードを抑止したいため.
#! ruby -Ks # coding: windows-31j require 'pp' require 'nkf' def windows31j_to_utf8(s) # Windows-31J から UTF-8 (Byte Order Mark; BOM 無し) へ変換 # nkf については http://www.ruby-lang.org/ja/man/html/nkf.html if ( RUBY_VERSION < "1.9" ) return NKF::nkf( '-Swm0', s ) else # Ruby 1.9 では入力が "Windows-31J" かどうかは気にしない(自動判別機能を信じることにする) return s.encode("UTF-8") end end def utf8_to_windows31j(s) # UTF-8 から Windows-31J へ変換 # nkf については http://www.ruby-lang.org/ja/man/html/nkf.html if ( RUBY_VERSION < "1.9" ) return NKF::nkf( '-Wsm0', s ) else # Ruby 1.9 では入力が "UTF-8" かどうかは気にしない(自動判別機能を信じることにする) return s.encode("Windows-31J") end end if __FILE__ == $0 # 半角カナ print windows31j_to_utf8 "コンニチハ\n" print utf8_to_windows31j windows31j_to_utf8 "コンニチハ\n" # 「"① ② I Ⅱ ㍉ ㌢ ㈱"」は Shift_JIS にはなく,Shift_JIS を拡張した文字コードセットである Windows-31J にある print windows31j_to_utf8 "① ② I Ⅱ ㍉ ㌢ ㈱\n" print utf8_to_windows31j windows31j_to_utf8 "① ② I Ⅱ ㍉ ㌢ ㈱\n" # 「"‖ 〜 − ¢ £ ¬ " 」は Shift_JIS, EUC-JP, ISO-2022-JP では同じ文字コードなのに Windows-31J では違う文字コード print windows31j_to_utf8 "‖ 〜 − ¢ £ ¬ \n" print utf8_to_windows31j windows31j_to_utf8 "‖ 〜 − ¢ £ ¬ \n" # Shift_JIS では 2 バイト目が「5C」になっているもの print windows31j_to_utf8 "表 十 構\n" print utf8_to_windows31j windows31j_to_utf8 "表 十 構\n" # その他 print windows31j_to_utf8 "〒\n" print utf8_to_windows31j windows31j_to_utf8 "〒\n" end
【実行結果の例】
* Ruby バージョン 1.8 以下では,UTF-8 への変換において NKF を使う.このとき,半角カナは全角カナに変換されるように設定していることに注意(必要ならプログラムを書き換えてください).
* 下記の実行結果において,Windows-31J しか表示できないコンソールを使っているので,UTF-8 はうまく表示できない(のは当然)
