{-# 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中进行字符解码,报告此类错误?
答案 0 :(得分:2)
除了上面的评论,这里有一个解决方案:计算输入UTF-8字节流中U + FFFD的出现次数(这是一个安全的操作,因为UTF-8是子字符串安全的 - 请参阅{{3} }),然后计算转换后的字符串中的出现次数。如果它们不同,则在转换过程中出现编码错误。