You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 65001
    
    然后再运行你的脚本:
    stack tmp.hs
    
  • PowerShell环境:
    先设置控制台输出编码为UTF-8:
    [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    
    再执行脚本命令。

2. 永久修复(全局生效)

如果不想每次打开控制台都手动设置编码,可以修改系统配置:

  • CMD永久设置UTF-8:
    1. 打开CMD,右键标题栏选择「属性」;
    2. 切换到「选项」标签页,在「当前代码页」下拉菜单中选择「UTF-8 (65001)」;
    3. 点击「确定」,重启CMD后生效(Windows 10 1903及以上版本支持这个可视化设置,旧版本可以通过修改注册表实现:在HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe下新建字符串值CodePage,赋值为65001)。
  • PowerShell永久设置UTF-8:
    1. 打开PowerShell,执行命令创建/打开配置文件:
      notepad $PROFILE
      
    2. 在打开的记事本中添加一行代码:
      [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
      
    3. 保存文件并重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:38:40