Skip to content

Commit

Permalink
Showing 2 changed files with 8 additions and 1 deletion.
7 changes: 7 additions & 0 deletions spec/std/io/io_spec.cr
Original file line number Diff line number Diff line change
@@ -582,6 +582,13 @@ describe IO do
m.set_encoding("UTF-8", invalid: :skip)
m.gets_to_end.bytesize.should eq(4277)
end

it "decodes incomplete multibyte sequence with skip (3) (#3285)" do
str = File.read("#{__DIR__}/../data/io_data_incomplete_multibyte_sequence_2.txt")
m = MemoryIO.new(Base64.decode_string str)
m.set_encoding("UTF-8", invalid: :skip)
m.gets_to_end.bytesize.should eq(8977)
end
end

describe "encode" do
2 changes: 1 addition & 1 deletion src/io/encoding.cr
Original file line number Diff line number Diff line change
@@ -91,7 +91,6 @@ module IO
# Convert bytes using iconv
out_buffer = @out_buffer.to_unsafe
out_buffer_left = LibC::SizeT.new(OUT_BUFFER_SIZE)
old_in_buffer_left = @in_buffer_left
result = @iconv.convert(pointerof(@in_buffer), pointerof(@in_buffer_left), pointerof(out_buffer), pointerof(out_buffer_left))
@out_slice = @out_buffer[0, OUT_BUFFER_SIZE - out_buffer_left]

@@ -103,6 +102,7 @@ module IO
@iconv.handle_invalid(pointerof(@in_buffer), pointerof(@in_buffer_left))
when Errno::EINVAL
# EINVAL means "An incomplete multibyte sequence has been encountered in the input."
old_in_buffer_left = @in_buffer_left

# On invalid multibyte sequence we try to read more bytes
# to see if they complete the sequence

0 comments on commit 97c7d0d

Please sign in to comment.