【问题标题】:Windows console doesn't seem to like UnicodeWindows 控制台似乎不喜欢 Unicode
【发布时间】: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 控制台中,无需任何额外的魔法。

这里有两个问题:

  1. 是 Windows 的错还是 Haskell 的错?
  2. 我该如何解决?

附: 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


【解决方案1】:

此函数采用句柄的当前文本编码,并使其替换安全字符,如“?”当输出控制台不支持的字符时(注意:Windows 控制台本身不支持这些字符,但大多数其他支持 unicode 的语言默认应用变通方法)

makeSafe h = do
  e <- hGetEncoding h
  case e of
    Nothing -> return ()
    Just e1 -> do
      e' <- mkTextEncoding (show e1 ++ "//TRANSLIT")
      hSetEncoding h e'

可以像这样在main函数的开头使用:

main = do
  mapM_ makeSafe [stdout,stderr,stdin]
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多