Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

全角カタカナを半角カタカナに変換する(SJIS限定)

てっきりNKFで変換出来るんだと思っていたら、そうでもないらしい。
手習いでコードを一個一個確認しながら作ってみた。

全角カタカナ以外の文字を入れるといきなり例外になる香ばしい仕様なのでパクる時には注意してください。

Z2HMap = {
  64  => [167],65  => [177],    66  => [168],67  => [178],          #ァアィイ
  68  => [169],69  => [179],    70  => [170],71  => [180],          #ゥウェエ
  72  => [171],73  => [181],                                          #ォオ
  74  => [182],75  => [182,22],76  => [183],77  => [183,22],      #カガキギ
  78  => [184],79  => [184,22],80  => [185],81  => [185,22],      #クグケゲ
  82  => [186],83  => [186,22],84  => [187],85  => [187,22],      #コゴサザ
  86  => [188],87  => [188,22],88  => [189],89  => [189,22],      #シジスズ
  90  => [190],91  => [190,22],92  => [191],93  => [191,22],      #セゼソゾ
  94  => [192],95  => [192,22],96  => [193],97  => [193,22],      #タダチヂ
  98  => [175],99  => [194],    100 => [194,22],                    #ッツヅ
  101 => [195],102 => [195,22],103 => [196],104 => [196,22],      #テデトド
  105 => [197],106 => [198],107 => [199],108 => [200],109 => [201],#ナニヌネノ
  110 => [202],111 => [202,22],112 => [202,23],                    #ハバパ
  113 => [203],114 => [203,22],115 => [203,23],                    #ヒビピ
  116 => [204],117 => [204,22],118 => [204,23],                    #フブプ
  119 => [205],120 => [205,22],121 => [205,23],                    #ヘベペ
  122 => [206],123 => [206,22],124 => [206,23],                    #ホボポ
  125 => [207],126 => [208],128 => [209],129 => [210],130 => [211],#マミムメモ
  131 => [172],132 => [212],133 => [173],134 => [213],              #ャヤュユ
  135 => [174],136 => [214],                                          #ョヨ
  137 => [215],138 => [216],139 => [217],140 => [218],141 => [219],#ラリルレロ
  143 => [220],146 => [166],147 => [221],148 => [179,22]}           #ワヲンヴ

def z2h(str)
  out = ""
  first_byte = nil
  
  str.each_byte do |b|
    case first_byte
    when 129 #"ー"だけ1バイト目が129
      out += "" if b == 91
      first_byte = nil
    when 131 #2バイト目
      out += Z2HMap[b].pack("C*")
      first_byte = nil
    when nil #1バイト目
      first_byte = b
    else
      raise "I Can't Convert:Illigal First Byte"
    end
  end
  out
end