LoginSignup
4
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-02

整数と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)
4
2
0

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
4
2