簡體   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