2013-10-12 3 views
4

Это мой код:Поддерживает ли Splice Unicode?

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/> 

И выход в браузере is

-� 

Что я сделал не так?


Извините за задержку, я был занят на некоторое время, и теперь я вернусь, и я думаю, что не может сделать вопрос достаточно конкретно @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!

+0

Возможно, вам следует предоставить ссылку на источник этой библиотеки. Я не слышал об этом и не могу найти его через hoogle/google. – jtobin

+0

Heist поддерживает Unicode. См. [Мой ответ здесь] (http: // stackoverflow.com/questions/18931786/how-to-show-utf8-text-with-snap-and-heist/18965748 # 18965748) для более подробной информации. – mightybyte

+0

@mightybyte Но doesn't yieldRuntimeText использовать fromText, который исходит от Blaze.ByteString.Builder.Char8? Извините, если я ошибаюсь, я отвечу на этот вопрос. – danidiaz

ответ

3

UPDATE: Проблема, описанная в этом ответе было исправлено в версии heist0.13.0.2.

source code для yieldRuntimeText является:

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

Из того, что модуль приходит, что fromText функции? В разделе импорта мы находим:

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

documentation для последнего пакета говорит:

Примечание: Этот пакет предназначен для использования низкого уровня, как внедрение протоколов. Если вам нужно сериализовать символы 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. 

Mmmmm поэтому, возможно, проблема в том, что кодирование от текста к 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 
+0

Отличная детективная работа. Я просто загрузил исправленную версию в hackage как heist-0.13.0.2. Если вы обновляетесь до этой версии, она должна работать без определения вашего собственного 'yieldRuntimeTextUtf8'. – mightybyte

Смежные вопросы