mattak's blog

気の向くままに書く

IRCにて、ISO-2022-JPでencodeした文字列を出力したい

環境

mac, ruby 2.1.1

結論

IRCからinput (iso-2022-jp => utf-8)はできたが、output(utf-8 => iso-2022-jp)はよくわからない。 最終的にecho #{word} | nkf -jで逃げた。

Encoding系のメソッドを試す。

$ pry
[1] pry(main)> require 'nkf'
=> true
[2] pry(main)> word = "花澤香菜"
=> "花澤香菜"
[3] pry(main)> word_jis  = `echo #{ word } | nkf -j`
=> "\e:Z\e(B\n"
[4] pry(main)> word_utf8 = `echo #{ word } | nkf -w`
=> "花澤香菜\n"
[5] pry(main)>
[6] pry(main)> # input-test: iso-2022-jp -> utf8
[7] pry(main)> NKF.nkf('-w', word_jis) # OK
=> "花澤香菜\n"
[8] pry(main)> word_jis.encode('UTF-8') # NG
=> "\e:Z\e(B\n"
[9] pry(main)> word_jis.force_encoding('UTF-8') # NG
=> "\e:Z\e(B\n"
[10] pry(main)> word_jis.force_encoding('ISO-2022-JP').encode('UTF-8') # OK
=> "花澤香菜\n"
[11] pry(main)> Encoding::Converter.new('ISO-2022-JP', 'UTF-8').convert(word_jis) #OK
=> "花澤香菜\n"
[12] pry(main)>
[13] pry(main)> # output-test: utf-8 -> iso-2022-jp
[14] pry(main)> NKF.nkf('-j', word_utf8) # NG
=> "\e\x24\x42\x32\x56\x5F\x37\x39\x61\x3A\x5A\e\x28\x42\n"
[15] pry(main)> word_utf8.encode('ISO-2022-JP') # NG
=> "\e\x24\x42\x32\x56\x5F\x37\x39\x61\x3A\x5A\e\x28\x42\n"
[16] pry(main)> word_utf8.force_encoding('ISO-2022-JP') # NG
=> "\xE8\x8A\xB1\xE6\xBE\xA4\xE9\xA6\x99\xE8\x8F\x9C\n"
[17] pry(main)> word_utf8.force_encoding('UTF-8').encode('ISO-2022-JP') # NG
=> "\e\x24\x42\x32\x56\x5F\x37\x39\x61\x3A\x5A\e\x28\x42\n"
[18] pry(main)> Encoding::Converter.new('UTF-8', 'ISO-2022-JP').convert(word_utf8) # NG
=> "\e\x24\x42\x32\x56\x5F\x37\x39\x61\x3A\x5A\e\x28\x42\n"

inputはうまくいくのだが、outputがうまくいってない。。 encode時になにかオプションをつけるとうまくいく気もするが、、そのようなものを発見できなかった。誰かしってたら教えてください。