首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Splice支持Unicode吗?

Splice支持Unicode吗?
EN

Stack Overflow用户
提问于 2013-10-12 02:32:48
回答 1查看 188关注 0票数 4

这是我的密码:

代码语言:javascript
复制
 testSplice :: C.Splice Handler
 testSplice = return $ C.yieldRuntimeText $ do
    return "中文"

我把它绑在标签上:

代码语言:javascript
复制
  splices :: Splices (C.Splice Handler)
  splices =
      "testSplice" ## testSplice

并在layout.tpl上使用:

代码语言:javascript
复制
   <meta charset="UTF-8"> 
   <testSplice/>

浏览器上的输出是

代码语言:javascript
复制
    -�

我做错了什么?

抱歉,我已经忙了一段时间了,现在我回来了,我想我可能没有把这个问题说得足够具体,这里是问题发生的代码,我希望它能使问题更加说明:

test.hs:

代码语言:javascript
复制
{-# LANGUAGE OverloadedStrings #-}
import Snap
import Heist
import qualified Heist.Compiled as C
import Data.Monoid
import Control.Monad.Trans.Either
import Data.Maybe

main :: IO ()
main = quickHttpServe site

site :: Snap ()
site = 
    route [("/", testSnap)]

testSnap :: Snap ()
testSnap = do
    hs <- liftIO $ load "template" splices
    let runtime = fromJust $ C.renderTemplate hs "test"
    builder <-liftIO  (fst runtime)
    writeBuilder builder
  where
    splices :: Splices (C.Splice IO)
    splices = 
        "testSplice" ## testSplice

load :: MonadIO n
    => FilePath
    -> Splices (C.Splice n)
    -> IO (HeistState n)
load baseDir splices = do
    tmap <- runEitherT $ do
        let t = loadTemplates baseDir
            hc = HeistConfig
                    defaultInterpretedSplices
                    defaultLoadTimeSplices
                    splices
                    mempty
                    [t]
        initHeist hc
    either (error . concat) return tmap

testSplice :: C.Splice IO
testSplice = return $ C.yieldRuntimeText $ do return "中文" 

模板/test.tpl

代码语言:javascript
复制
<html>
  <head>
    <meta charset="UTF-8">
  </head>
 <body>
     <testSplice/>
 </body>
 </html>

现在我尝试了抢劫-0.13.0.2,它现在工作的很好,伟大的工作,丹尼尔!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-12 07:22:39

更新:这个答案中描述的问题已经在heist版本0.13.0.2中得到了纠正。

源代码 for yieldRuntimeText是:

代码语言:javascript
复制
yieldRuntimeText :: Monad n => RuntimeSplice n Text -> DList (Chunk n)
yieldRuntimeText = yieldRuntime .  liftM fromText

fromText函数是从哪个模块产生的?在“进口”一节中我们发现:

代码语言:javascript
复制
import           Blaze.ByteString.Builder
import           Blaze.ByteString.Builder.Char8

后一个包的文档说:

注意:这个包是为低级别使用的,比如实现协议.如果您需要序列化Unicode字符,请使用其中一个UTF编码(例如,“Blaze.ByteString.Builder.Char.UTF-8”)。

还包括:

代码语言:javascript
复制
fromText :: Text -> BuilderSource

O(n). Serialize the lower 8-bits of all characters in the strict text.

也许问题是从文本到生成器的编码不是在UTF-8中完成的?尝试使用完全相同的代码定义您自己版本的yieldRuntimeText,但是使用以下导入:

代码语言:javascript
复制
import           Blaze.ByteString.Builder
import           Blaze.ByteString.Builder.Char.Utf8

yieldRuntimeTextUtf8 :: Monad n => RuntimeSplice n Text -> DList (Chunk n)
yieldRuntimeTextUtf8 = yieldRuntime .  liftM fromText
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19329857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档