2014-11-13 107 views
1
{-# LANGUAGE OverloadedStrings #-} 
import Data.Text.IO 
import Data.Text.ICU.Convert 
import Prelude hiding (putStrLn) 
main = do 
    conv <- open "utf8" Nothing 
    putStrLn $ toUnicode conv "h\xffzzah" 

該程序嘗試解碼無效的UTF-8字符串;它打印「h zzah」,轉換器用U + FFFD REPLACEMENT CHARACTER替換了無效字節。我寧願它拋出一個異常(例如,Data.Text.ICU.Error.ICUError)。有沒有辦法讓它這樣做,或者否則報告解碼沒有真正成功?使Data.Text.ICU.Convert.toUnicode報告解碼失敗

另外,是否有不同的方式做Haskell中的字符解碼,它報告這種類型的錯誤?

+0

如果存在U + FFFD信號表示輸入不是有效的utf8字符串,則定義執行轉換的函數,如果結果包含該字符,則會拋出錯誤。 – user2407038

+0

@ user2407038但如果FFFD在源文檔中正確編碼會怎麼樣? –

+0

U + FFFD應該只出現在從「Unicode中未知或無法表示的」字符轉換後的文檔中。所以無論是在您的轉換還是在之前的轉換中發生錯誤。我很難想出一個用例,其中這兩種情況必須以不同的方式處理。 – jsalvata

回答

2

除了我上面的評論,這裏有一個解決方案:計算輸入UTF-8字節流中的U + FFFD的出現次數(這是安全操作,因爲UTF-8是子字符串安全的 - 請參閱http://research.swtch.com/utf8),然後計算轉換字符串中的出現次數。如果它們不同,則在轉換過程中出現編碼錯誤。