8

我正在 f# 中制作基于控制台的纸牌游戏,并且正在努力使用 unicode 字符显示纸牌套装。将 suit-to-char 映射为以下函数:

let suitSymbol = function
    | Spades   -> "\u2660"
    | Clubs    -> "\u2663"
    | Diamonds -> "\u2666"
    | Hearts   -> "\u2665"

显示这个使用

printf "%s" <| suitSymbol Spades

在 fsi 中工作正常:

金融情报服务
但是当使用 fsc.exe 编译时,它会显示不同的(不适合)字符:

命令提示符

我试过改变源文件的编码,但没有效果。编译时有什么方法可以工作吗?

编辑(30.01.2017):斯图尔特的回答是正确的,但我无法克服它需要输入的事实

chcp 65001

每次我想运行我的游戏。

在研究了在 F# 中引用 DLL 的方法后,我想出了以下解决方案:

module Kernel =
    [<DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)>]
    extern bool SetConsoleOutputCP(uint32 wCodePageID)

在我添加的主要功能代码中

[<EntryPoint>]
let main args =
    Kernel.SetConsoleOutputCP 65001u |> ignore

它仅修改此进程的代码页,因此其他应用程序将正常运行。

4

1 回答 1

4

在您的命令提示符下,您需要像这样更改代码页:

chcp 65001

经过一些测试,我能够重现您的问题,这解决了它。归功于@s952163

于 2017-01-22T23:38:37.203 回答