여기의 문제는 writeBS 또는 writeText에서 발생하지 않습니다. 그것은 OverloadedStrings 확장에 의해 사용 된 변환과 함께입니다. ByteString과 Text의 차이점을 이해하는 것도 중요합니다. ByteString은 원시 바이트입니다. 문자 또는 인코딩의 개념은 없습니다. 그것이 Text가 들어오는 곳입니다. Data.Text.Encoding 모듈에는 Text와 ByteString을 서로 다른 인코딩을 사용하여 변환하기위한 많은 함수가 있습니다. 나를 위해, 다음의 모두 같은 출력을 생성 :
writeBS $ encodeUtf8 "你好世界"
writeText "你好世界"
문자 그대로 당신의 문자열이 OverloadedStrings 확장에 의해 ByteString로 전환되고 있기 때문에 코드가 작동하지 않은 이유는, 그것은 당신에게 동작을 제공하지 않습니다 네가 원해. 해결책은 적절한 유형으로 취급하는 것입니다. 텍스트. 사물의 강도 짓 측면에서
다음은 나를 위해 잘 작동 : 앞의 두가되지 않지만
route [("test", cRender "test")]
사실이 하나, 브라우저에서 제대로 렌더링합니다. 차이점은 cRender
이 적절한 content-type을 설정한다는 것입니다. 다음 스 니펫을 사용하여 차이점을 관찰하는 것이 계몽 적이라는 것을 알게되었습니다.
site = route [ ("/test1", writeBS "你好世界")
, ("/test2", writeBS $ encodeUtf8 "你好世界")
, ("/test3", writeText "你好世界")
, ("/test4", modifyResponse (setContentType "text/html;charset=utf-8") >> writeText "你好世界")
, ("/testHeist", cRender "test")
]
내 브라우저에서 test4 및 testHeist가 올바르게 작동합니다. 테스트 2와 3은 올바른 동작을 제공하지만 컨텐트 유형이 없기 때문에 브라우저에서 제대로 렌더링하지 못할 수 있습니다.
"유니 코드를 지원하지 않습니다"는 의미는 무엇입니까? 당신이 시도한 것에 대한 작은 예를 보여줄 수 있고 당신이 기대하는 것과 실제로 일어날 일을 우리에게 말해 줄 수 있습니까? – bennofs
고마워, 내가 여기에 몇 가지 코드를 추가, 그것이 더 표현력이 좋겠 바랍니다. – Lynton