[英]How to use Snap/Heist without creating routes automatically for every template
[英]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.