Closed ttdoda closed 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 を読み飛ばすとそれ以降は改行の手前までは正しく読まれます。
概要
UTF-16LEな文字列から生成したStringIOで、getsが正しく動きません。
再現手順
結果
1行目は改行を表すバイト列 \x0A \x00 の内、1バイト目までが読み込まれています。 2行目は前の行の残った \x00 から読まれるので、壊れた文字列になります。 3行目で余計な \x00 を読み飛ばすとそれ以降は改行の手前までは正しく読まれます。