使Data.Text.ICU.Convert.toUnicode报告解码失败

时间:2014-11-13 23:08:25

标签: haskell character-encoding icu

{-# 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字符串;它打印&#34;h�zzah&#34;,转换器用U + FFFD REPLACEMENT CHARACTER替换了无效字节。我宁愿它抛出异常(比如,Data.Text.ICU.Error.ICUError)。有没有办法让它这样做,或以其他方式报告解码没有实际成功?

或者,是否有一种不同的方法在Haskell中进行字符解码,报告此类错误?

1 个答案:

答案 0 :(得分:2)

除了上面的评论,这里有一个解决方案:计算输入UTF-8字节流中U + FFFD的出现次数(这是一个安全的操作,因为UTF-8是子字符串安全的 - 请参阅{{3} }),然后计算转换后的字符串中的出现次数。如果它们不同,则在转换过程中出现编码错误。