2013-09-21 2 views
0

나는 스냅에서 writeText을 사용했으며 강도는 renderTemplate이지만 유니 코드를 지원하는 것 같지는 않습니다. snap과 heist로 utf8 텍스트를 표시하는 방법은 무엇입니까?

site :: Snap() 
site = do 
    ifTop (writeBS "你好世界") <|> 
    route [("test", testSnap)] 

testSnap :: Snap() 
testSnap = do 
    fromJust $ C.renderTemplate hs "test" 

-- test.tpl 

你好世界 

은 내가 / 또는 /test 경로에 대해 "你好 世界"출력을 예상하지만, 사실 그 출력은 좀 지저분한 코드입니다.

+1

"유니 코드를 지원하지 않습니다"는 의미는 무엇입니까? 당신이 시도한 것에 대한 작은 예를 보여줄 수 있고 당신이 기대하는 것과 실제로 일어날 일을 우리에게 말해 줄 수 있습니까? – bennofs

+0

고마워, 내가 여기에 몇 가지 코드를 추가, 그것이 더 표현력이 좋겠 바랍니다. – Lynton

답변

0

여기의 문제는 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은 올바른 동작을 제공하지만 컨텐트 유형이 없기 때문에 브라우저에서 제대로 렌더링하지 못할 수 있습니다.

+0

자세한 답변을 해주셔서 감사합니다. 텍스트가 유니 코드의 올바른 유형 인 것 같습니다.하지만 스플 라이스를 사용하면 텍스트가 T로 가져오고 'C.yieldRuntimeText $ do T.pack'을 반환합니다. 你好 世界 " 나는 스플 라이스를 사용할 때 "你好 世界"를 얻을 것이라고 생각했지만 실제로 브라우저에서 지저분한 코드를 얻었습니다. – Lynton

+0

T.pack을 사용하지 마십시오. 그것은 String 타입의 인수를받습니다. 즉, OverloadedStrings가 리터럴을 String으로 변환 한 다음 팩을 Text로 변환합니다. 그냥'C.yieldRuntimeText $ return '을해라. – mightybyte

+0

하지만 스플 라이스를 사용하여 FilePath를 생성하는 중입니다. FilePath는 실제로는 다음과 같은 문자열입니다.'s = "你好 世界":: FilePath', 어떻게 스플 라이스로 표시해야합니까? – Lynton

관련 문제