2017-01-22 12 views
8

Я делаю консольную карточную игру в f #, и я борется с отображением карточных костюмов с использованием символов юникода. Mapping костюм к полукокса представлен в виде следующей функции:F # - карточные костюмы, которые не отображаются в консоли

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

Отображено это с помощью

printf "%s" <| suitSymbol Spades 

отлично работает в FSI:

fsi
, но при компиляции с помощью fsc.exe он отображает различный (не подходит) символы:

cmd prompt

Я пробовал менять кодировку исходного файла, но не имел никакого эффекта. Есть ли способ работать с компиляцией?

EDIT (30.01.2017): anwser Стюарт был правильным, но я не мог получить над фактом, что он должен ввести

chcp 65001 

каждый раз, когда я хотел, чтобы запустить свою игру.

После изучения путей ссылки библиотеки DLL в F #, я придумал следующее решение:

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

И в основной функции кода я добавил

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

Он изменяет кодовую страницу для этого процесса только, поэтому другие приложения будут вести себя нормально.

+0

Я подозреваю, что это связано с использованием разных шрифтов (хотя они выглядят очень похожими). – Stuart

+0

После того, как вы скомпилируете его с fsc, где вы его запускаете, и каковы настройки шрифта? – Stuart

+0

Это тот же шрифт. Оба скриншота из одного окна консоли. Консола запускается из cmd. – Muchtrix

ответ

4

В командной строке вам нужно изменить кодовую страницу, как это:

chcp 65001 

После некоторого тестирования я был в состоянии воспроизвести проблему, и это фиксирует его. Кредит @ s952163