From: Eric Wong Date: 2017-06-07T00:53:15+00:00 Subject: [ruby-core:81600] Re: [Ruby trunk Feature#13626] Add String#byteslice! samuel@oriontransfer.org wrote: > Thanks for that idea. > > If that's the case, when appending to the write buffer: > > ~~~ > write_buffer = String.new.b > unicode_string = "\u1234".force_encoding("UTF-8") > write_buffer << unicode_string > write_buffer.encoding # Changed from ASCII-8BIT to Encoding:UTF-8 > ~~~ > > The only way I can think to fix this is to run +force_encoding+ on the write buffer after every append but this seems hugely inefficient. > > Ideas? String#force_encoding is done in-place so it should not be that slow, the String#<< would be the slow part since it involves at least one memcpy (worst case is realloc + 2 memcpy) But I'm not sure why you would want to be setting data to UTF-8; I guess you got it from some 3rd-party library? Maybe String#b! could be shorter alias for force_encoding(Encoding::UTF_8); but yeah, exposing writev via [Feature #9323] is probably the best option, anyways. Fwiw, I'm also not convinced String#<< behavior about changing write_buffer to Encoding::UTF-8 in your above example is good behavior on Ruby's part... But I don't know much about human language encodings, I am just a *nix plumber where a byte is a byte. Unsubscribe: