2017-01-22 5 views
8

Ich mache ein Konsolenkartenspiel in f # und ich kämpfe mit der Anzeige von Kartenanzügen mit Unicode-Zeichen. Mapping-Anzug-to-Zeichen wird als folgende Funktion dargestellt:F # - Kartenanzüge, die nicht in der Konsole angezeigt werden

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

Die Darstellung dieser mit

printf "%s" <| suitSymbol Spades 

funktioniert gut in fsi:

fsi
aber wenn kompiliert fsc.exe es angezeigt mit diffrent (nicht suit) Zeichen:

cmd prompt

Ich habe versucht, Codierung der Quelldatei zu ändern, aber ohne Wirkung. Gibt es eine Möglichkeit, dass es funktioniert, wenn es kompiliert wird?

EDIT (2017.01.30): Stuart anwser war richtig, aber ich konnte nicht über Tatsache erhalten, dass es

chcp 65001 

jedes Mal, wenn ich mein Spiel laufen wollte Eingabe erforderlich.

Nach Wegen der Referenzierung DLLs in F # zu studieren, kam ich mit folgenden Lösung:

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

Und in Code Hauptfunktion Ich habe

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

Es Codepage für diesen Prozess modifiziert nur, damit sich andere Apps normal verhalten.

+0

Ich vermute, dass dies mit verschiedenen Schriftarten zu tun ist verwendet werden (obwohl sie sehr ähnlich aussehen). – Stuart

+0

Nachdem Sie es mit fsc kompiliert haben, wo laufen Sie es, und was sind Ihre Schriftarteinstellungen? – Stuart

+0

Es ist die gleiche Schriftart. Beide Screenshots stammen aus demselben Konsolenfenster. Es ist consolas laufen von cmd. – Muchtrix

Antwort

4

In Ihrer Eingabeaufforderung müssen Sie Ihren Code Seite wie folgt ändern:

chcp 65001 

Nach einigen Tests konnte ich das Problem reproduzieren, und diese fixiert es. Kredit an @ s952163

Verwandte Themen