【发布时间】:2015-05-02 16:12:03
【问题描述】:
我通常在 Linux 上开发 Haskell 程序,然后构建和测试一些 它们在 Windows 上。说,我有一些输出 Unicode 的控制台程序 符号。特别是,它恰好输出版权符号“©”,如 这个:
Copyright © 2015 Boo
它在 Arch Linux 上运行良好,但在 Windows 7 上打印如下:
Copyright program_name.EXE: <stdout>: commitAndReleaseBuffer: invalid
argument (invalid character)
我不确定,但我认为输出 unicode 符号应该是可行的 在 Windows 控制台中,无需任何额外的魔法。
这里有两个问题:
- 是 Windows 的错还是 Haskell 的错?
- 我该如何解决?
附: MinGHC 已被使用,因为它有 GHC 7.10。
【问题讨论】:
-
您需要调用
WriteConsoleW(注意宽字符 API 上的“W”后缀),但这是在 Haskell 中完成的。 -
@eryksun,我天真地认为高级 Haskell 库可以为我处理这个......
-
在运行程序之前尝试运行
chcp 65001。 -
@chi,代码页 65001 (UTF-8) 在控制台服务器 (conhost.exe) 中存在错误,因为它假定字节字符串是 ANSI(例如,西方语言环境中每个字符一个字节)。这会导致它错误地报告写入
WriteFile的字节数,从而导致错误输出。更糟糕的是在conhost!SrvReadConsole中将输入编码为多字节UTF-8 失败,因为缓冲区太小,但它返回ReadFile/ReadConsoleA已成功读取0 个字节,这将被解释为EOF和通常会导致交互式 REPL 退出。这太有问题了。 -
可能是控制台的替代品,例如 conemu? conemu.github.io/en/UnicodeSupport.html 另外,PowerShell 提供什么?
标签: windows haskell unicode console