Yukihiro Matsumoto wrote: > Hi, > > In message "Re: nil encoding as synonym for binary encoding" > on Sat, 12 Jan 2008 03:04:00 +0900, David Flanagan <david / davidflanagan.com> writes: > > |I don't understand. Are you saying that in the current implementation > |set_encoding(nil) is different than > |set_encoding(Encoding.default_external) and also different than > |set_encoding(Encoding::BINARY)? What does it do, then? > > set_encoding(nil) - default > * read encoding - Encoding.default_external > * write encoding - anything, no check > > set_encoding(Encoding.default_external) > * read encoding - Encoding.default_external > * write encoding - check whether default_external > > set_encoding(Encoding::BINARY)? > * read encoding - Encoding::BINARY > * write encoding - check whether Encoding::BINARY > > See? > > matz. > Yes, I think I see now. But it raises more questions: 0) Is no check on write really different than checking for Encoding::BINARY on write? Because ASCII-8BIT/BINARY is the legacy encoding that is traditionally used as a byte string, I would have thought that transcoding to BINARY would really just be a no-op the same as force_encoding(BINARY) and that set_encoding(nil) and set_encoding(BINARY) would actually behave the same on writes. Is it the introduction of encodings like UTF-16le that are not ASCII supersets that causes this assumption to fail? 1) My understanding is that sockets and pipes are different than files and start off with a "read encoding" of Encoding::BINARY. Is that still true? If so, what does set_encoding(nil) do to a pipe, then? Does it reset it to its default binary encoding, or does it change it to the default external encoding? 2) Do the internal_encoding and external_encoding methods return the read encoding or the write encoding of a stream? I think I have to agree with Dave that you're asking the set_encoding method to do too many things here. There is internal vs. external encoding. There is read vs. write encoding. And there's files vs pipes and sockets which have different default encodings. That is a lot for one method to manipulate and still be understandable to its users. Maybe you need separate set_read_encoding and set_write_encoding methods? Or maybe allow a mode string argument to set_encoding. If this string is "r" (the default) then only the read encoding is set. If "w", then only the write encoding is set. If "r+" then both encodings are set. Or allow the "r" or "w" as a prefix to the encoding name, so the argument to set_encoding could look just like a mode string passed to File.open: socket.set_encoding("r:utf-8") # set read encoding socket.set_encoding("w:binary") # set write encoding But that doesn't really address my original issue of distinguishing between nil and BINARY, however. David