在Haskell中运行外部程序时保持Unicode字符

时间:2017-03-15 09:03:32

标签: haskell unicode

我试图通过在stdin中传递Lazy Text来运行外部命令。该文本包含unicode字符,但它们未在输出中正确显示。以下是外部命令为tee的最小示例。对于shell实用程序,我使用shellmate

Sh.shell $ do
  hStdIn <- Sh.getStdIn
  hStdOut <- Sh.getStdOut
  Sh.liftIO $ IO.hSetEncoding hStdIn IO.utf8
  Sh.liftIO $ IO.hSetEncoding hStdOut IO.utf8
  Sh.echo_ someText Sh.|> Sh.run "tee" []

如果输出中的someText×,我会看到

我还尝试使用encodeUtf8函数将文本转换为ByteString,然后转换为String。

import Data.ByteString.UTF8 (toString, fromString)
import Data.Text.Encoding (encodeUtf8, decodeUtf8)
import Data.Text.Lazy (toStrict, fromStrict)

Sh.echo_ (toString . encodeUtf8 . toStrict (someText))
  Sh.|> Sh.run "tee" []

并解码为

(fromStrict . decodeUtf8 . fromString) c

修改

我无法用shellmate修复此问题,因此开始使用System.Process

import qualified System.IO as IO

(Just inp, Just outp, _, phandle) <-
  P.createProcess
    (P.proc "tee" [])
    { P.std_out = P.CreatePipe, P.std_in = P.CreatePipe }

IO.hSetEncoding inp IO.utf8
IO.hSetEncoding outp IO.utf8

IO.hPutStr inp someText

outputText <- IO.hGetContents outp

0 个答案:

没有答案