I'm going out of my mind trying to simply output UTF-8-encoded data to the console.
I've managed to accomplish this using String
, but now I'd like to do the same with ByteString
. Is there a nice and fast way to do this?
This is what I've got so far, and it's not working:
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)
main :: IO ()
main = putStr $ pack "čušpajž日本語"
It prints out uapaj~�,�
, ugh.
I'd like an answer for the newest GHC 6.12.1 best, although I'd like to hear answers for previous versions as well.
Thanks!
Update: Simply reading and outputting the same UTF-8-encoded line of text seems to work correctly. (Using Data.ByteString.Char8
, I just do a putStr =<< getLine
.) But packed values from inside the .hs file, as in the above example, refuse to output properly... I must be doing something wrong?
bytestrings
are strings of bytes. When they're output, they will be truncated to 8 bits, as it describes in the documentation forData.ByteString.Char8
. You'll need to explicitly convert them to utf8 - via theutf8-string
package on Hackage, which contains support for bytestrings.However, as of 2011, you should use the
text
package, for fast, packed unicode output. GHC truncating Unicode character outputYour example becomes a lot simpler:
Like so:
utf8-string
supports bytestrings.This is a known ghc bug, marked "wontfix".