ruby / stringio

Pseudo `IO` class from/to `String`.
BSD 2-Clause "Simplified" License
33 stars 26 forks source link

UTF-16LEな文字列でgetsが正しく動かない #68

Closed ttdoda closed 10 months ago

ttdoda commented 10 months ago

概要

UTF-16LEな文字列から生成したStringIOで、getsが正しく動きません。

再現手順

require 'stringio'

str = "line1\nline2\nline3\n".encode("utf-16le")
sio = StringIO.new(str)

p sio.gets
p sio.gets
p sio.getbyte
p sio.gets

結果

"line1\x0A"
"\u6C00\u6900\u6E00\u6500\u3200\u0A00"
0
"line3\x0A"

1行目は改行を表すバイト列 \x0A \x00 の内、1バイト目までが読み込まれています。 2行目は前の行の残った \x00 から読まれるので、壊れた文字列になります。 3行目で余計な \x00 を読み飛ばすとそれ以降は改行の手前までは正しく読まれます。