Splice是否支持Unicode?

时间:2013-10-12 02:32:48

标签: haskell haskell-snap-framework heist

这是我的代码:

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

我将它绑定到标签:

  splices :: Splices (C.Splice Handler)
  splices =
      "testSplice" ## testSplice

并在layout.tpl上使用它:

   <meta charset="UTF-8"> 
   <testSplice/>

浏览器上的输出是

    -�

我做错了什么?


抱歉延迟了,我已经忙了一段时间了,现在我回来了,我想我可能不会特别提问这个问题@mightybyte 这是问题发生的代码,我希望它会使问题更具说明性:

test.hs:

{-# 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

<html>
  <head>
    <meta charset="UTF-8">
  </head>
 <body>
     <testSplice/>
 </body>
 </html>

现在我尝试了heist-0.13.0.2,它现在运行正常,干得好!Daniel!

1 个答案:

答案 0 :(得分:3)

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

yieldRuntimeText的{​​{3}}是:

yieldRuntimeText :: Monad n => RuntimeSplice n Text -> DList (Chunk n)
yieldRuntimeText = yieldRuntime .  liftM fromText

fromText函数来自哪个模块?在导入部分,我们发现:

import           Blaze.ByteString.Builder
import           Blaze.ByteString.Builder.Char8

后一个包的source code说:

  

注意:此程序包用于低级别使用,如实现   协议。如果需要序列化Unicode字符,请使用其中一个   UTF编码(例如'Blaze.ByteString.Builder.Char.UTF-8')。

还有:

fromText :: Text -> BuilderSource

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

嗯,所以可能问题是从Text到Builder的编码没有在UTF-8中完成?尝试使用完全相同的代码定义您自己的yieldRuntimeText版本,但改为使用以下导入:

import           Blaze.ByteString.Builder
import           Blaze.ByteString.Builder.Char.Utf8

yieldRuntimeTextUtf8 :: Monad n => RuntimeSplice n Text -> DList (Chunk n)
yieldRuntimeTextUtf8 = yieldRuntime .  liftM fromText