Windows中Haskell的UTF-8输入/输出

Windows中Haskell的UTF-8输入/输出,haskell,utf-8,terminal,console,Haskell,Utf 8,Terminal,Console,无论是使用Prelude中的getLine/putStrLn还是Data.Text.IO中的getLine/putStrLn,下面的简单代码在具有UTF-8字符的Windows终端中都无法正常工作: main=forever$getLine>>=putStrLn 它在输入过程中回显utf-8字符,然后打印“?”s代替utf-8字符;使用chcp 65001切换编码使其成为空格 我已经下载了新的终端,并按照建议启用了utf-8支持,但没有效果 似乎相关,但提出的解决方案不起作用(代码也一样) 显

无论是使用Prelude中的getLine/putStrLn还是Data.Text.IO中的getLine/putStrLn,下面的简单代码在具有UTF-8字符的Windows终端中都无法正常工作:

main=forever$getLine>>=putStrLn
它在输入过程中回显utf-8字符,然后打印“?”s代替utf-8字符;使用
chcp 65001
切换编码使其成为空格

我已经下载了新的终端,并按照建议启用了utf-8支持,但没有效果

似乎相关,但提出的解决方案不起作用(代码也一样)

显然python有一个

是否有任何库/解决方案可用于GHC 8.x

请帮忙

编辑:经过进一步调查,问题也出现在输入过程中-如果我使用
mapM(print.ord)s
打印字符代码,而不是putStrLn,则它们要么是63,而不更改编码,要么是0,在
chcp 65001
之后


hSetEncoding stdin utf8
没有帮助

我找到了执行此操作的库:

它不包括getLine(仅关键事件),但它非常简单,可以实现:

import Control.Monad.IO.Class(liftIO)
导入系统。退出(exitSuccess)
导入系统。终端为C
getTermLine::MonadTerminal m=>m字符串
getTermLine=getChars“”
哪里
getChars=awaitEvent>>=processKey s
processKey s=\case
右键(KeyEvent key ms)->键的大小写
查基c
|ms==mempty | | ms==shiftKey->do
C.putChar C
flush--在Windows中不使用flush,但在Mac中不使用flush
getChars(c:s)
|否则->获取字符
输入键->执行
普顿
脸红
纯$s
BackspaceKey->do
向后移动光标1
擦除字符1
脸红
getChars$如果为null,则为s,否则为尾部
_->getChars
左中断->liftIO exitSuccess
_->getChars

您使用的是哪个windows版本?它是windows 10