Rubyメモ: 文字列を 1 文字ずつに分割する

1 文字ずつ切り出す

String クラスの chars メソッド(別名 each_char)を使用すると、文字列内の文字を 1 文字ずつ取り出しながら処理することができます。

s = 'ABC'
p s.chars
s.chars { |ch| puts ch }
$ ruby sample.rb
["A", "B", "C"]
A
B
C

1 文字ずつコードポイントを得る

文字列内の文字 1 文字ごとのコードポイントを取得するには、codepoints(別名 each_codepoint)を使用します。

# encoding: utf-8

s = 'ABCあいう'
s.codepoints { |x| printf('U+%04X ', x) }
$ ruby sample.rb
U+0041 U+0042 U+0043 U+3042 U+3044 U+3046

もとの文字とコードポイントの対応付けがわかるようにするには、下記のように ord メソッドを組み合わせて使用するのがよいでしょう。 ord は、その文字列の先頭の文字のコードポイントを返します。

# encoding: utf-8

s = 'ABCあいう'
s.chars { |ch| printf("U+%04X %s\n", ch.ord, ch) }
U+0041 A
U+0042 B
U+0043 C
U+3042 あ
U+3044 い
U+3046 う

コラム: Ruby では 1 文字ずつに分割しても文字列型

Java や C++ には、1 文字を表す char 型がありますが、Ruby の場合はすべて文字列です。 そのため、下記のように分割したあとの型 (class) を調べると、String と表示されます。

'ABC'.each_char do |ch|
  puts "#{ch} -- #{ch.class}"
end
A -- String
B -- String
C -- String