2012-12-26 11 views
10

Ich möchte ein Haskell-Skript machen, um Dateien in meinem/home-Ordner zu lesen. Es gibt jedoch viele Dateien, die mit chinesischen Schriftzeichen benannt sind, und Haskell und Ghci können es nicht verwalten. Es scheint, dass Haskell und Ghci UTF-8-Zeichen nicht gut darstellen können.Wie kann man Haskell oder Ghci in der Lage sein, chinesische Schriftzeichen zu zeigen und chinesische Schriftzeichen mit Namen zu benutzen?

Hier ist, was ich zu tun:

Prelude> "让Haskell或者Ghci能正确显示汉字并且读取汉字命名的文档" 

"\35753Haskell\25110\32773Ghci\33021\27491\30830\26174\31034\27721\23383\24182\19988\35835\21462\27721\23383\21629\21517\30340\25991\26723" 
+7

Dies beantwortet nicht wirklich Ihre Frage, aber ich werde kommentieren, dass Sie dieses Problem nicht mit einem Programm haben, das Zeichenfolgen mit 'putStrLn' und Freunden druckt. Auch [diese SO-Frage] (http://stackoverflow.com/questions/5535512/how-to-hack-ghci-or-hugs-so-that-it-prints-unicode-chars-unescaped) könnte hilfreich sein für dich. – gspr

Antwort

18
Prelude> putStrLn "\35753Haskell\25110\32773Ghci\33021\27491\30830\26174\31034\27721\23383\24182\19988\35835\21462\27721\23383\21629\21517\30340\25991\26723" 
让Haskell或者Ghci能正确显示汉字并且读取汉字命名的文档 

GHC behandelt Unicode gut. Dies sind die Dinge, die Sie wissen sollten:

Es verwendet Ihre Systemcodierung für die Konvertierung von Byte zu Zeichen und zurück beim Lesen von oder Schreiben in die Konsole. Da in Ihrem Beispiel die Konvertierung von Bytes in Zeichen richtig war, würde ich sagen, dass Ihre Systemcodierung korrekt eingestellt ist.

Die show-Funktion auf String hat einen begrenzten Ausgabezeichensatz. Die show-Funktion wird von GHCI verwendet, um das Ergebnis der Auswertung eines Ausdrucks zu drucken, und von der print-Funktion, um den übergebenen Wert in eine String-Darstellung zu konvertieren.

Die Funktionen putStr und putStrLn sind für das Schreiben einer String an die Konsole genau so, wie sie ihnen zur Verfügung gestellt wurde.

+0

Ich habe versucht "hGetLine h >> = hPutStr g" und die Datei mit Ziel g erhält wirklich den richtigen Inhalt. Aber ghci kann normalerweise keine chinesischen Zeichen anzeigen. – TorosFanny

+8

@ user1926094: es ist nicht so sehr "kann nicht" als "nicht". Es * wählt *, um ihnen zu entkommen, weil die maskierte Version von Ihrem Terminal oder Ihrer Schriftart oder etwas anderem nicht vermasselt werden kann. –

0

Dank Carl, verwendet i putStrLn als Wrapper um meine fuction:

ghci> let removeNonUppercase st = [c | c <- st, c `elem` ['А'..'Я']] 
ghci> putStrLn (removeNonUppercase "Ха-ха-ха! А-ха-ха!") 
ХА 

Alles funktioniert gut!