2013-12-21 1 views
5

Data.Text의 IO 기능을 사용하여 입력 텍스트를 가져오고 싶습니다. 제 지진은 인코딩 검색과 관련이 있습니다. 즉, 내가 직접 텍스트 인코딩을 인식하지 못한다면 읽는 텍스트의 인코딩이 시스템 로캘 설정과 다른 상황에서 IO가 어떤 용도로 사용되는 것입니까? Data.Text 어딘가에 인코딩 검색 메커니즘이 있습니까?하스켈에서 바이트 문자열, 텍스트 및 인코딩

나는 "Data.ByteString"을 사용하는 답변을 얻을 수도 있지만 텍스트 읽기를 사용하지 않기 위해 만들어진 Data.Text은 아니 었습니까?

또한 Data.ByteString을 사용해야하는 경우 누구나 옥텟 0x80 ~ 0x9f를 읽으면 어떻게되는지 알 수 있습니까? 나머지 입력과 마찬가지로 예상대로 읽습니까? 그것들은 ISO-8859-1에서 정의되지 않았고, Data.ByteString의 IO는 소스가 ISO-8859-1 인 것처럼 입력이 처리되는 것으로 나타납니다.

+2

* "Data.Text 어딘가에 인코딩 검색 메커니즘이 있습니까?"* [No] (http://stackoverflow.com/a/90956/1139697). – Zeta

+1

ByteString을 입력하면 입력을 ISO-8859-1로 처리한다는 것을 알 수 있습니까? –

+0

[Data.ByteString] (http://hackage.haskell.org/package/bytestring-0.10.4.0/docs/Data-ByteString.html)의 사양 - 정의에 따라 지연 및 char8 변형에도 표시됩니다. hGetContents –

답변

3

미리 인코딩을 모른다면 Data.ByteString을 사용하고 바이너리 모드로 읽는 것이 옳은 일이라고 생각합니다. 0x80에서 0x9f까지의 옥텟을 포함하는 바이트로 입력 데이터를 정확히 받아야합니다.

Data.Text은 알려진 인코딩 또는 오히려 디코딩 된 형식으로 무언가를 표현하는 올바른 방법이지만, 읽은 상태에서 디코딩을 할 수 없다면 그 시점에서 사용하는 것이 타당하지 않을 것이라고 생각합니다.

코드가 나중에 인코딩을 적절하게 알거나 추측 할 수있는 경우 전환 할 적절한 시간입니다.

+0

감사합니다. 주위를 둘러 볼 수있는 방법이 있는지 궁금 해서요.하지만 그렇게 생각하지는 않습니다. –

+1

내가 말하고자하는 것은 아무것도 얻을 수 없다는 것입니다. ByteString은 인코딩을 알기 전까지 올바른 표현입니다. –

5

당신은 예를 들어, 읽기 바이트 ByteString를 사용하고자하고 있습니다 : Data.Text.Encoding에서

decodeUtf8' :: ByteString -> Either UnicodeException Text 

을 실제로 원시 데이터를 디코딩 및 인코딩 오류를 처리 할 수 ​​있습니다. 인코딩 추측을 위해 text에는 미리 정의 된 메커니즘이 없지만 여러 번 디코드하거나 ICU의 문자 세트 감지 기능을 사용할 수 있습니다. 죄송하지만이 기능은 현재 text-icu에서 사용할 수 없으므로 직접 가져와야합니다.

+0

감사합니다. 나는 그보다 덜 clunky 한 것이 있는지 궁금해하고 있었지만, 그것이해야한다고 생각합니다. –