GHC/HandleEncoding.hs

    -- | See GHC #10762 and #15021.
    module GHC.HandleEncoding (configureHandleEncoding) where

    import GHC.IO.Encoding (textEncodingName)
    import System.Environment
    import System.IO

    -- | Handle GHC-specific character encoding flags, allowing us to control how
    -- GHC produces output regardless of OS.
    configureHandleEncoding :: IO ()
    configureHandleEncoding = do
       env <- getEnvironment
       case lookup "GHC_CHARENC" env of
        Just "UTF-8" -> do
         hSetEncoding stdout utf8
         hSetEncoding stderr utf8
        _ -> do
         -- Avoid GHC erroring out when trying to display unhandled characters
         hSetTranslit stdout
         hSetTranslit stderr

    -- | Change the character encoding of the given Handle to transliterate
    -- on unsupported characters instead of throwing an exception
    hSetTranslit :: Handle -> IO ()
    hSetTranslit h = do
        menc <- hGetEncoding h
        case fmap textEncodingName menc of
            Just name | '/' `notElem` name -> do
                enc' <- mkTextEncoding $ name ++ "//TRANSLIT"
                hSetEncoding h enc'
            _ -> return ()