スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

文字から文字コードを取得しよう

1.8.xではこんな風にしてました。

    a = "ab"
    p "a=#{a[0]}"
#=>a=97

でも、これが利用できなくなりました。
原因?として、stringクラスに文字コード情報が付加したためにブロックされたのではないかなあと考えてます。
いろいろ検討した結果が以下の通り。

    a = "ab"
    p "a=#{a}"
    p "a[0]=#{a[0]}"
    p "a.ord=#{a.ord}"
    p "a[0].ord=#{a[0].ord}"
    p "a.unpack('C*')[0]=#{a.unpack('C*')[0]}"
  p "a.unpack('C')[0]=#{a.unpack('C')[0]}"
#=>"a=ab"
#=>"a[0]=a"
#=>"a.ord=97"
#=>"a[0].ord=97"
#=>"a.unpack('C*')[0]=97"
#=>"a.unpack('C')[0]=97"

1.8.xではunpack利用が推奨、1.9.xからはordが利用可能。
両方のバージョンだったら、とりあえずunpack利用しておけばいいと思われる。

また、文字の結合もきちんと明示しないとだめになったようです。

#-------------------------------1.8.x
    a = "ab"
    p "a.unpack('C*').to_s=" + a.unpack('C*').to_s
#=>"a=9798"
#-------------------------------1.9.x
    a = "ab"
    p "a.unpack('C*').to_s="+a.unpack('C*').to_s
#=>"a=["9798"]"

なんか配列になった!!!!!
ここではjoinを利用すると良さげ。
Array#join(区切り文字)は指定した区切り文字で配列を連結し、文字列を返してくれる。
指定しない場合は区切り文字なし。単純な配列の連結が可能。

#-------------------------------1.9.x
    a = "ab"
    p "a.unpack('C*').to_s="+a.unpack('C*').to_s
    p "a.unpack('C*').to_s="+a.unpack('C*').join
#=>"a=["9798"]"
#=>"a=9798"

packとunpackの使い方はマスターしたいなあ。
なんだかリファレンスだとpackで連結した文字列を返してくれそうなんだけど、気のせいかしら。