繁体   English   中英

如何使用 snap 和 heist 显示 utf8 文本?

[英]How to show utf8 text with snap and heist?

我已经使用writeBS writeText从捕捉和renderTemplate从抢劫,但没有人似乎支持Unicode。

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

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

-- test.tpl

你好世界

我希望它为//test路由输出“你好世界”,但实际上它的输出只是一些混乱的代码。

这里的问题不在于 writeBS 或 writeText。 它与 OverloadedStrings 扩展使用的转换有关。 了解 ByteString 和 Text 之间的区别也很重要。 ByteString 用于原始字节。 没有字符或编码的概念。 这就是 Text 的用武之地。 Data.Text.Encoding模块有一堆函数可以使用不同的编码在 Text 和 ByteString 之间进行转换。 对我来说,以下两个生成相同的输出:

writeBS $ encodeUtf8 "你好世界"
writeText "你好世界"

您的代码不起作用的原因是因为您的字符串文字被 OverloadedStrings 扩展转换为 ByteString,并且它没有给您想要的行为。 解决方案是将其视为正确的类型...文本。

在抢劫方面,以下对我来说很好用:

route [("test", cRender "test")]

事实上,这个在我的浏览器中可以正确呈现,而前两个则没有。 不同之处在于cRender设置了适当的内容类型。 我发现使用以下代码段观察差异很有启发性。

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 为您提供了正确的行为,但由于缺少内容类型,浏览器可能无法正确呈现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM