Windows环境下Stack运行tmp.hs时输出乱码问题排查与解决
问题分析与解决方案
这绝对是字符编码不兼容导致的问题——Windows 10的CMD/PowerShell默认编码和Haskell Stack运行时的输出编码经常不匹配,尤其是当你的Haskell代码输出非ASCII字符(比如中文、特殊符号)时,就会出现乱码或奇怪字符。
为什么会出现这个问题?
Windows的控制台环境和类Unix系统的编码逻辑差异很大:
- CMD默认使用GBK编码(代码页936),早期PowerShell默认依赖系统的ANSI编码;
- 而Haskell程序(包括通过Stack运行的脚本)默认会以UTF-8编码输出内容,两种编码格式不匹配,就会导致字符解析错误,出现乱码。
解决方法
1. 临时修复(单次会话生效)
这种方法适合临时测试,不需要修改系统设置:
- CMD环境:
先执行命令切换到UTF-8编码:
然后再运行你的脚本:chcp 65001stack tmp.hs - PowerShell环境:
先设置控制台输出编码为UTF-8:
再执行脚本命令。[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
2. 永久修复(全局生效)
如果不想每次打开控制台都手动设置编码,可以修改系统配置:
- CMD永久设置UTF-8:
- 打开CMD,右键标题栏选择「属性」;
- 切换到「选项」标签页,在「当前代码页」下拉菜单中选择「UTF-8 (65001)」;
- 点击「确定」,重启CMD后生效(Windows 10 1903及以上版本支持这个可视化设置,旧版本可以通过修改注册表实现:在
HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe下新建字符串值CodePage,赋值为65001)。
- PowerShell永久设置UTF-8:
- 打开PowerShell,执行命令创建/打开配置文件:
notepad $PROFILE - 在打开的记事本中添加一行代码:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 保存文件并重启PowerShell,设置会自动生效。
- 打开PowerShell,执行命令创建/打开配置文件:
3. 在Haskell代码中指定编码
如果你不想修改控制台配置,也可以在代码里强制设置输出编码,匹配Windows控制台的编码:
比如代码里明确设置为UTF-8(对应控制台的65001编码):
import System.IO main = do hSetEncoding stdout utf8 -- 你的业务代码,比如: putStrLn "测试中文输出"
如果控制台默认是GBK编码,也可以改成cp936:
hSetEncoding stdout (mkTextEncoding "CP936")
内容的提问来源于stack exchange,提问作者LudvigH
相关产品推荐
相关产品推荐

