Ruby

Ruby で文字列と整数の相互変換

More than 1 year has passed since last update.

整数と16進数文字列の相互変換

to_s と to_i を使います。

> 0xabcd.to_s(16)
=> "abcd"
> "abcd".to_i(16)
=> 43981
> 0xabcd
=> 43981

文字列と16進数文字列の相互変換

pack と unpack を使います。目に見えない文字列の内容を調べるときに重宝します。

> 'abcd'.unpack('H*').first
=> "61626364"
> ['61626364'].pack('H*')
=> "abcd"

整数と文字列の相互変換

不正なコードポイントの範囲も含めて、文字列をつくるには pack を使います。

> [0xabcd.to_s(16)].pack("H*")
=> "\xAB\xCD"
> "\xab\xcd".unpack('H*').first.to_i(16)
=> 43981
> 0xabcd
=> 43981

エンコーディングを調べるには encoding プロパティにアクセスします。エンコーディングを変更するには force_encoding を使います。

> "\xab\xcd".encoding
=> #<Encoding:UTF-8>
> "\xab\xcd".force_encoding('cp932').encoding
=> #<Encoding:Windows-31J>

Unicode 以外のレガシーエンコーディングの場合、有効なコードポイントの範囲であれば chr を使って文字列を生成することができます。

> 0x82a0.chr('cp932')
=> "\x{82A0}"

不正な範囲では、エラーになります。

> 0xffff.chr('cp932')
RangeError: invalid codepoint 0xFFFF in Windows-31J

フォールバックの文字を指定するのであれば rescue を使います。

begin
  c = 0xffff.chr('cp932')
rescue RangeError => ex
  c = '?'
end

puts c

有効な文字列であれば ord を使うことができます。

> "\x82\xA0".force_encoding('cp932').ord
=> 33440
irb(main):031:0> 0x82a0
=> 33440

フォールバックの値を用意するには rescue を使います。

begin
  c = '\xff\xff'.force_encoding('cp932').ord
rescue ArgumentError => ex
  c = '?'.force_encoding('cp932').ord
end

puts c.to_s(16)