2012-12-26 12 views
10

Chcę utworzyć skrypt Haskella do odczytu plików w folderze my/home. Istnieje jednak wiele plików nazwanych chińskimi znakami, a Haskell i Ghci nie mogą nimi zarządzać. Wygląda na to, że Haskell i Ghci nie są dobrzy w wyświetlaniu znaków UTF-8.Jak uczynić Haskell lub ghci zdolnym do wyświetlania chińskich znaków i uruchamiania chińskich znaków o nazwie skrypty?

Oto co napotkał:

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

To tak naprawdę nie odpowiada na twoje pytanie, ale powiem, że nie będziesz mieć problemu z programem drukującym ciągi znaków z 'putStrLn' i przyjaciółmi. Również [to pytanie SO] (http://stackoverflow.com/questions/5535512/how-to-hack-ghci-or-hugs-so-that-it-prints-unicode-chars-unescaped) może być pomocne do Ciebie. – gspr

Odpowiedz

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 obsługuje unicode dobrze. Oto rzeczy, które powinieneś o tym wiedzieć:

Używa twojego kodowania systemu do konwersji z bajtu na znaki i z powrotem podczas czytania lub pisania na konsoli. Ponieważ w twoim przykładzie poprawnie przeliczono bajty na znaki, powiedziałbym, że twoje kodowanie systemu jest ustawione prawidłowo.

Funkcja show na String ma ograniczony zestaw znaków wyjściowych. Funkcja GHCI używa funkcji show do drukowania wyniku oceny wyrażenia oraz funkcji print w celu przekonwertowania wartości przekazanej do reprezentacji String.

Funkcje putStr i putStrLn służą do zapisywania na konsolę String dokładnie w takiej samej formie, w jakiej zostały do ​​niej dostarczone.

+0

Próbowałem "hGetLine h >> = hPutStr g", a plik odpowiadający celowi g naprawdę pobiera poprawną zawartość. Ale ghci nie może normalnie wyświetlać chińskich znaków. – TorosFanny

+8

@ user1926094: to nie tyle "nie może", co "nie". To * wybiera *, aby uciec przed nimi, ponieważ wersja ze zmienionym hasłem nie może zostać zgaszona przez twój terminal, ani przez twoją czcionkę, ani przez cokolwiek innego. –

0

Dzięki Carl użyłem putStrLn jak owinięcie wokół mojego fuction:

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

Wszystko działa bez zarzutu!

Powiązane problemy