With a block given, calls the block with each successive codepoint from self; sets the position to end-of-stream; returns +self+. Each codepoint is the integer value for a character; returns self: codepoints = [] strio = StringIO.new('hello') strio.each_codepoint {|codepoint| codepoints.push(codepoint) } strio.eof? # => true codepoints # => [104, 101, 108, 108, 111] codepoints = [] strio = StringIO.new('тест') strio.each_codepoint {|codepoint| codepoints.push(codepoint) } codepoints # => [1090, 1077, 1089, 1090] codepoints = [] strio = StringIO.new('こんにちは') strio.each_codepoint {|codepoint| codepoints.push(codepoint) } codepoints # => [12371, 12435, 12395, 12385, 12399] Position in the stream matters: codepoints = [] strio = StringIO.new('こんにちは') strio.getc # => "こ" strio.pos # => 3 strio.each_codepoint {|codepoint| codepoints.push(codepoint) } codepoints # => [12435, 12395, 12385, 12399] When at end-of-stream, the block is not called: strio.eof? # => true strio.each_codepoint {|codepoint| fail 'Boo!' } strio.eof? # => true With no block given, returns a new {Enumerator}[rdoc-ref:Enumerator].