Я делаю консольную карточную игру в f #, и я борется с отображением карточных костюмов с использованием символов юникода. Mapping костюм к полукокса представлен в виде следующей функции:F # - карточные костюмы, которые не отображаются в консоли
let suitSymbol = function
| Spades -> "\u2660"
| Clubs -> "\u2663"
| Diamonds -> "\u2666"
| Hearts -> "\u2665"
Отображено это с помощью
printf "%s" <| suitSymbol Spades
отлично работает в FSI:
, но при компиляции с помощью fsc.exe он отображает различный (не подходит) символы:
Я пробовал менять кодировку исходного файла, но не имел никакого эффекта. Есть ли способ работать с компиляцией?
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
Он изменяет кодовую страницу для этого процесса только, поэтому другие приложения будут вести себя нормально.
Я подозреваю, что это связано с использованием разных шрифтов (хотя они выглядят очень похожими). – Stuart
После того, как вы скомпилируете его с fsc, где вы его запускаете, и каковы настройки шрифта? – Stuart
Это тот же шрифт. Оба скриншота из одного окна консоли. Консола запускается из cmd. – Muchtrix