2014-11-13 1 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 문자열을 디코드하려고 시도합니다. 변환기는 잘못된 바이트를 U + FFFD REPLACEMENT CHARACTER로 바꾼 "h zzah"를 출력합니다. 차라리 예외 (예 : Data.Text.ICU.Error.ICUError)가 발생했습니다. 그럴 수있는 방법이 있을까요, 그렇지 않으면 해독이 실제로 성공하지 못했다고보고 할 수 있습니까?Data.Text.ICU.Convert.toUnicode가 디코딩 실패를보고 함

또는이 유형의 오류를보고하는 Haskell에서 문자 디코딩을하는 다른 방법이 있습니까?

+0

입력이 유효한 utf8 문자열이 아니라는 것을 U + FFFD가 알리는 경우 변환을 수행하는 함수를 정의한 다음 그 결과가 해당 문자와 ​​일치하면 오류가 발생합니다. – user2407038

+0

@ user2407038하지만 원본 문서에서 FFFD가 올바르게 인코딩 된 경우 어떻게해야합니까? –

+0

U + FFFD는 "유니 코드에서 알 수 없거나 표현할 수없는"문자에서 변환 된 문서에만 나타나야합니다. 그래서 오류가 귀하의 전환이나 이전에 발생했습니다. 이 두 경우를 다르게 처리해야하는 유스 케이스에 대해 생각해 보려고 힘듭니다. – jsalvata

답변

2

입력 한 UTF-8 바이트 스트림에서 U + FFFD의 발생 횟수를 계산하십시오 (UTF-8이 부분 문자열 안전성이므로 안전한 작업 임 - http://research.swtch.com/utf8 참조). 변환 된 문자열에서 발생을 계산하십시오. 차이가있는 경우 변환 중에 인코딩 오류가 발생했습니다.