金子邦彦研究室プログラミングRuby プログラミングRuby で日本語文字コードの変換

Ruby で日本語文字コードの変換

Ruby を使って,漢字コードの変換を行うプログラム例を示す.

※ nkf を用いて半角カナを全角に変換, 全角数字を半角に変換するプログラムについては,別の Web ページ で説明している.

日本語文字コードの変換

要点

Ruby バージョン 1.9 系列の String::encode に関する情報

NKF の主要なオプション

【ソースコード】

-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 はうまく表示できない(のは当然)

[image]