2013-10-12 3 views
4

이 내 코드입니다 :Splice는 유니 코드를 지원합니까?

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

해당 라이브러리의 소스에 대한 링크를 제공해야합니다. 나는 그것에 대해 들어 본 적이 없으며 google/google을 통해 찾을 수 없습니다. – jtobin

+0

강도는 유니 코드를 지원합니다. [my answer here] (http : // stackoverflow.co/questions/18931786/how-to-show-utf8-text-with-snap-and-heist/18965748 # 18965748)를 참조하십시오. – mightybyte

+0

@mightybyte 그러나 yieldRuntimeText는 Blaze.ByteString.Builder.Char8에서 오는 fromText를 사용하지 않습니까? 죄송합니다. 내가 잘못하면, 그 경우에 제 대답을 철회 할 것입니다. – danidiaz

답변

3

UPDATE는 :이 답변에서 설명하는 문제가 heist 버전 0.13.0.2 수정되었습니다. yieldRuntimeText에 대한

source code은 다음과 같습니다 어떤 모듈에서

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

fromText 작동하는지 온다? 가져 오기 섹션에서 우리는 발견 :

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

후자 패키지의 documentation는 말한다 :

참고 :이 패키지는 프로토콜을 구현 같은 낮은 수준의 사용하기위한 것입니다. 유니 코드 문자를 직렬화해야하는 경우 UTF 인코딩 중 하나를 사용하십시오 (예 : 'Blaze.ByteString.Builder.Char.UTF-8').

도 :

빌더 텍스트의 인코딩이 UTF-8에서 수행되지 않는 것을
fromText :: Text -> BuilderSource 

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

다음 기회가 그래서 아마 문제가? 동일한 코드를 사용하지만 대신 다음 가져 오기를 사용하여 자신 만의 버전 인 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

뛰어난 형사 작업입니다. 방금 heist-0.13.0.2로 hackage에 고정 버전을 업로드했습니다. 이 버전으로 업그레이드하면 자신의'yieldRuntimeTextUtf8'을 정의하지 않아도 작동합니다. – mightybyte

관련 문제