2012-12-26 11 views
10

Voglio fare uno script Haskell per leggere i file nella mia cartella/home. Tuttavia ci sono molti file chiamati con caratteri cinesi, e Haskell e Ghci non riescono a gestirlo. Sembra che Haskell e Ghci non siano bravi a mostrare caratteri UTF-8.Come rendere Haskell o ghci in grado di mostrare caratteri cinesi ed eseguire caratteri cinesi chiamati script?

Ecco quello che ho incontrato:

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

Questo in realtà non risponde alla tua domanda, ma commenterò che non avrai questo problema con un programma che stampa stringhe con 'putStrLn' e amici. Inoltre, [questa domanda SO] (http://stackoverflow.com/questions/5535512/how-to-hack-ghci-or-hugs-so-t--prints-unicode-chars-unescaped) potrebbe essere d'aiuto a te. – gspr

risposta

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 gestisce unicode bene. Queste sono le cose che dovresti sapere al riguardo:

Utilizza la codifica del sistema per la conversione da byte a caratteri e viceversa durante la lettura o la scrittura sulla console. Dal momento che ha eseguito correttamente la conversione da byte a caratteri nel tuo esempio, direi che la codifica del tuo sistema è impostata correttamente.

La funzione show su String ha un set di caratteri di uscita limitato. La funzione show viene utilizzata da GHCI per stampare il risultato della valutazione di un'espressione e dalla funzione print per convertire il valore passato in una rappresentazione String.

I putStr e putStrLn funzioni sono per la scrittura in realtà un String alla console esattamente come è stato previsto per loro.

+0

Ho provato "hGetLine h >> = hPutStr g" e il file corrispondente a target g ottiene veramente il contenuto corretto. Ma ghci non può visualizzare normalmente i caratteri cinesi. – TorosFanny

+8

@ user1926094: non è tanto "impossibile" quanto "non". * Sceglie * di sfuggirle, perché la versione di escape non può essere rovinata dal tuo terminale, dal tuo font o da qualsiasi altra cosa. –

0

Grazie a Carl, ho usato putStrLn come un involucro intorno al mio fuction:

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

Tutto funziona benissimo!

Problemi correlati