我试图通过在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