LoginSignup
9
7

More than 5 years have passed since last update.

読みをポケベル入力数字に変換するPokebell gem

Last updated at Posted at 2014-06-26

きっかけ

文字列をポケベルの数字列で暗号化、またポケベルの数字列から文字列に復号化する、というものが載っていたので自分で、コードを書いてみました。
Rubyで暗号化、復号化 - Qiita

「暗号化とは言えんと思うなぁ、数字のまま読める人種が居たし(解説:メッセージを表示できるポケベルが出た当初は 数字しか表示できなかった ので、脳内で復号化した)。それにしても、これをハッシュのテーブルで扱うのは上手くないような気がする…文字コードでうまく扱えないだろうか」
と思ったのがきっかけです。
しかしドツボに嵌まりました。
なぜなら……五十音順になっている文字コードは半角カナだけだったからですw

インストール

rubugemsでインストールしてください。

$ gem install pokebell

ソース

Github に上げてます。
riocampos/pokebell

使い方

ひらがな、カタカナ、数字、Alphabet(大文字/小文字、全角/半角)、記号の一部をポケベルの二桁数字に変換します。濁点や半濁点も問題なく変換します(半角カナ変換時に用いたNKFライブラリのおかげです)。

pokeberu = Pokebell.new("ぽけべる")
pokeberu.pokebell #=> "650524640493"
pokeberu.code     #=> "650524640493"
pokeberu.str      #=> "ぽけべる"
pokeberu.to_a     #=> "ぽけべる"

変換テーブル

このテーブルを参考にしました。

table
ベル打ちのすすめ ―2タッチ入力― (It's fine today!)

あとで検索したらこういうのもありました。

table
【武蔵野電波のプロトタイパーズ】ピポパ音を解読するDTMFデコーダを作ってポケベル打ちに挑戦!

なお、テーブルの右部分が違うものもありました。

table
お盆休み。。。4 - うめちゃんのしょ~もない毎日♪

DoCoMoとそれ以外(テレメッセージ系)の会社で異なったのではないかと思われますが、今回 Pokebell gem で取り上げた変換テーブルがどちらのものなのかは不明です(おそらく DoCoMo でしょうが)。

変換テーブル部分

結局、一部はハッシュテーブルになりました、とさ。

class Pokebell
  def encode(code)
    code2pokebell_hash = {
      166 => "02", # を
      63 => "67", # ?
      33 => "68", # !
      45 => "69", # −
      304 => "69", # ー
      47 => "60", # /
      92 => "76", # ¥
      38 => "77", # &
      40 => "82", # (
      41 => "84", # )
      42 => "86", # *
      35 => "87", # #
      32 => "88", # 全角スペース
      350 => "04", # ゛
      351 => "05", # ゜
    }

    case code
    when 167..171 # ぁ-ぉ
      code = code + 10
    when 172..174 # ゃ-ょ
      code = code + 40
    when 175 # っ
      code = code + 19
    when 97..122 # a-z
      code = code - 32
    end

    case code
    when 177..211 # あ-も
      digit(code, 177, 1, 1)
    when 215..220 # ら-わ
      digit(code, 215, 9, 1)
    when 221..223 # ん゛゜
      digit(code, 220, 0, 2)
    when 212..214 # や-よ
      second_digit, first_digit = (code - 212).divmod(3)
      "#{(second_digit + 8) % 10}#{first_digit * 2 + 1}"
    when 65..90 # A-Z
      digit(code, 65, 1, 6)
    when 49..57 # 1-9
      digit(code, 49, 9, 6)
    when 48 # 0
      "00"
    when *code2pokebell_hash.keys
      code2pokebell_hash[code]
    else
      raise "out of aiming charactor area"
    end
  end

  def digit(code, base, first_digit_base, second_digit_base)
    second_digit, first_digit = (code - base).divmod(5)
    "#{(second_digit + first_digit_base) % 10}#{(first_digit + second_digit_base) % 10}"
  end
end

TODO

  • 絵文字対応(?, ☏, ?, ♡)
  • 復号化メソッド作成

rubygems の作り方手順

Jewelerで作ったGemをGithubとRubygemsに登録 - Qiita

9
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7