So apparently the decoder object created by Encode::Guess remembers that it's UTF-16 but forgets immediately whether it was big-endian or little-endian? That seems broken. But I guess I can add more code to handle that. What would you suggest to be the cleanest way? If Encode::Guess->guess returns a UTF-16 decoder object, should I throw it away, look at the first four bytes of the file, and create a new decoder using find_encoding( "UTF16BE" ) or find_encoding( "UTF16LE" )? Or store information about the byte order somewhere else, and use something other than $decoder->decode() to decode strings read from a UTF-16 file?