[Haskell-cafe] Ready for testing: Unicode support for Handle I/O
John Goerzen
jgoerzen at complete.org
Tue Feb 3 12:03:58 EST 2009
Simon Marlow wrote:
> I've been working on adding proper Unicode support to Handle I/O in GHC,
> and I finally have something that's ready for testing. I've put a patchset
> here:
Yay!
Comments below.
> Comments/discussion please!
Do you expect Hugs will be able to pick up all of this?
> The only change to the existing behaviour is that by default, text IO
> is done in the prevailing encoding of the system. Handles created by
> openBinaryFile use the Latin-1 encoding, as do Handles placed in
> binary mode using hSetBinaryMode.
Sounds very good and reasonable.
> We provide a way to change the encoding for an existing Handle:
>
> hSetEncoding :: Handle -> TextEncoding -> IO ()
>
> and various encodings:
>
> latin1,
> utf8,
> utf16, utf16le, utf16be,
> utf32, utf32le, utf32be,
> localeEncoding,
Will there also be something to handle the UTF-16 BOM marker? I'm not
sure what the best API for that is, since it may or may not be present,
but it should be considered -- and could perhaps help autodetect encoding.
> Thanks to suggestions from Duncan Coutts, it's possible to call
> hSetEncoding even on buffered read Handles, and the right thing
> happens. So we can read from text streams that include multiple
> encodings, such as an HTTP response or email message, without having
> to turn buffering off (though there is a penalty for switching
> encodings on a buffered Handle, as the IO system has to do some
> re-decoding to figure out where it should start reading from again).
Sounds useful, but is this the bit that causes the 30% performance hit?
> Performance is about 30% slower on "hGetContents >>= putStr" than
> before. I've profiled it, and about 25% of this is in doing the
> actual encoding/decoding, the rest is accounted for by the fact that
> we're shuffling around 32-bit chars rather than bytes in the Handle
> buffer, so there's not much we can do to improve this.
Does this mean that if we set the encoding to latin1, tat we should see
performance 5% worse than present?
30% slower is a big deal, especially since we're not all that speedy now.
> IO library restructuring
> ~~~~~~~~~~~~~~~~~~~~~~~~
>
> The major change here is that the implementation of the Handle
> operations is separated from the underlying IO device, using type
> classes. File descriptors are just one IO provider; I have also
> implemented memory-mapped files (good for random-access read/write)
> and a Handle that pipes output to a Chan (useful for testing code that
> writes to a Handle). New kinds of Handle can be implemented outside
> the base package, for instance someone could write bytestringToHandle.
> A Handle is made using mkFileHandle:
Very nice. That means I can eliminate all the HVIO stuff I have in
MissingH, which does roughly the same thing.
> with making new kinds of Handle. We could split up the layers further
> later.
Would it now be possible to make the Socket an instance of this
typeclass, so we can work with it directly rather than having to convert
it to a Handle first?
Thanks,
-- John
More information about the Haskell-Cafe
mailing list