Ruby
ネタ

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

More than 3 years have passed since last update.


きっかけ


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

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