. 당신 print
이 String
를 포함하는 값, Char
에 대한 Show
인스턴스가 사용
Prelude> print "Ёжик лижет мёд."
"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Prelude> putStrLn "\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Ёжик лижет мёд.
Prelude> "{\"a\": \"Ёжик лижет мёд.\"}"
"{\"a\": \"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076.\"}"
, 그리고 당신이 원하는 문양을 얻으려면 127 위의 코드 포인트로 모든 문자를 이스케이프, 당신은
String
을
putStr[Ln]
해야합니다.
encode = {-# SCC "encode" #-} encodeUtf8 . toLazyText . fromValue .
{-# SCC "toJSON" #-} toJSON
그래서 aeson
가 최종 타겟 ByteString
하지 Text
를 사용하는 이유는 질문 :이 때문에 예상 할 수있는 바와 같이
그래서 aeson
제대로는 UTF8 인코딩 된 입력을 디코딩 된 값 자체 UTF8 - 코딩 인코딩 및 디코딩 시작점.
이것이 적절한 유형입니다. 인코딩 된 값은 컴퓨터간에 이식 가능하도록 전송됩니다. 그것은 바이트의 흐름 (우리가 현학적 분위기라면)에 일어납니다. 정확히 ByteString
이 제공하는 것으로서, 응용 프로그램 특정 방식으로 처리되어야하는 바이트 시퀀스입니다. aeson
의 경우 바이트 스트림은 utf-8로 인코딩되어야하고 aeson
은 decode
함수의 입력이 유효한 utf-8이라고 가정하고 해당 출력을 유효한 utf-8로 인코딩합니다.
예 : Text
은 16 비트 인코딩이 엔디안 방식에 따라 다르므로 이식성 문제가 발생하므로 Text
은 컴퓨터간에 데이터를 교환하는 데 적합한 형식이 아닙니다. aeson
은 중간 단계에서 사용할 적절한 유형이기 때문에 인코딩 할 때 중간 유형으로 (그리고 아마도 디코딩 할 때도) Text
을 사용합니다.
ByteString은 텍스트보다 몇 년 앞선 것입니다. 의심 할 여지없이, 텍스트가 옵션이 아니었을 때 ByteString을 사용하기로 선택한 라이브러리가 꽤 많기 때문에 "잘못된 라이브러리 디자인"이라고 잘못 인용합니다. –
@stephentetley 나는 그 단어와 downvote에 대해 불쾌감을 느낀 것을 이해하지 못합니다. 어쨌든 나는 비판하려하지 않고 단지 일을 정리하려고 노력했습니다. 가능한 역사적 이유에 대한 귀하의 발언이 도움이됩니다. –
API 디자인에서 텍스트를 사용할 때 UTF8 인코딩을 사용하는 입력에 항상 의지 할 수 있어야합니다. 얼마나 많은 시간을 내가 그 가정을 만들었는지, 안전하고 건전한 느낌, 내 프로그램이 다른 인코딩을 나타 내기 위해 일어난 유효한 입력 (의미 적으로 문제 도메인에서 유효 함)에 대해 줄을 추락시키지 못했음을 말할 수 없습니다. 인터페이스가 텍스트 인 경우 더 이상 인코딩을 통해 프로그램 내부를 제어 할 수 없습니다. 대부분의 디자인에서 불필요하게 제한적이라는 것을 알았지 만 (물론 모든 것이 아닐지라도). – ozataman