Поддерживает ли 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/>

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

    -�

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


Извините за задержку, я был занят какое-то время, и теперь я возвращаюсь и думаю, что, возможно, недостаточно конкретизирую вопрос @mightybyte Вот код, в котором возникает проблема, я надеюсь, что это сделает вопрос более конкретным:

тест.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, и теперь он отлично работает, отличная работа, Даниэль!


person Lynton    schedule 12.10.2013    source источник
comment
Вероятно, вам следует предоставить ссылку на источник этой библиотеки. Я не слышал об этом и не могу найти через hoogle/google.   -  person jtobin    schedule 12.10.2013
comment
Heist поддерживает юникод. См. мой ответ здесь. подробности.   -  person mightybyte    schedule 13.10.2013
comment
@mightybyte Но разве yieldRuntimeText не использует fromText из Blaze.ByteString.Builder.Char8? Извините, если ошибаюсь, в таком случае я откажусь от своего ответа.   -  person danidiaz    schedule 13.10.2013
comment
@DanielDíazCarrete А, да. Вы совершенно правы. Я не прочитал ваш ответ достаточно близко. Пост, на который я ссылаюсь, верен, но он отображает строки напрямую с помощью snap-core, а не с помощью Heist.   -  person mightybyte    schedule 13.10.2013
comment
@mightybyte Пожалуйста, посмотрите обновленный исходный код, извините за задержку.   -  person Lynton    schedule 20.10.2013


Ответы (1)


ОБНОВЛЕНИЕ: проблема, описанная в этом ответе, была исправлена ​​в heist версии 0.13.0.2.

исходный код для yieldRuntimeText это:

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

Из какого модуля исходит эта функция fromText? В разделе импорта находим:

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

документация для последний пакет говорит:

Примечание. Этот пакет предназначен для низкоуровневого использования, например для реализации протоколов. Если вам нужно сериализовать символы 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
person danidiaz    schedule 12.10.2013
comment
Отличная детективная работа. Я только что загрузил исправленную версию в hackage как heist-0.13.0.2. Если вы обновитесь до этой версии, она должна работать без определения вашего собственного yieldRuntimeTextUtf8. - person mightybyte; 13.10.2013