2016-12-15 21 views
3

在測試文件我有以下的測試字符串:哈斯克爾不解析文本正確

部類 Test《 

我已經試過編碼既UTF-8的文件,有和沒有BOM,並使用UCS-2。 我試着將Haskell的編碼設置爲UTF-8。

文字永遠是作爲(或更糟):

"\8745\9559\9488\920\226\191\920\237\8359 Test\960\199\232" 

每當我鍵入打印"《"代碼"\12298"並從FILEREAD看到不\960\199\232

此行爲的任何解決方案?

+1

您正在讀取文件中的字節,但未將生成的UTF-8流解碼爲Unicode碼點列表。至於'print',它與'putStrLn相同。 show',所以你得到了一個代碼點的字符串表示。直接使用'putStrLn'會自動編寫代碼點,它將根據寫入的任何文件的默認編碼進行編碼。 – chepner

+1

也許你還應該提及你如何閱讀文件。 – chi

+0

@chepner感謝您的評論,但這不是關於打印。我使用這些符號來解析東西 - 我真的比較文件中的「」「和我的代碼中的」「」 - 並且因爲它不識別它而失敗。所以我不得不將它轉換爲unicode Codepoint,但我不知道如何,谷歌給我庫,有沒有一個本地解決方案? –

回答

7

猜測:您正在使用readFile或類似的並且正在使用非UTF8非UCS2區域設置。你可以通過設置你讀取的東西的編碼(文件句柄)並寫入(stdout或其他)來修復問題。例如,下面的程序讀取可靠,正確寫入測試文件對我來說:

import System.IO 

main = do 
    hSetEncoding stdout utf8 
    withFile "test.txt" ReadMode $ \h -> do 
     hSetEncoding h utf8 
     s <- hGetContents h 
     print s 
     putStr s 

另一種方法是用適當的語言環境中運行現有的程序;例如,嘗試:

LANG=en_US.utf8 runhaskell test.hs 

在最常用的現代炮彈,這將相應地設置LANG環境變量的程序中test.hs單次運行。

+0

謝謝!有一個小問題。它現在使用putStr將所描述的行顯示爲'πÇΘΘεθε'TestπÇ''。但是字符代碼似乎是正確的。我確定我的cmd可以顯示字符,但我不知道爲什麼。 –

+0

@JordyBrinks與通信一樣,發送者和接收者都必須同意他們使用的語言。該計劃宣佈它正在使用UTF-8來生成它的輸出;您的顯示器使用什麼編碼來解析顯示的輸出? –

+0

標準輸出的語言環境可能檢測得很好,你只需要移除'hSetEncoding stdout utf8'。 –