在Hakyll中使用中文标签

April 26, 2012, Tags: hakyll, encoding

此问题发生在GHC < 7.2.x的环境,据说7.2.x已经修正了造成此原因的bug(未验证)。

问题

Hakyll1会给每个标签单独生成一个html,比如foo.html, 用来显示标签对应的所有文章。 然而当标签为中文时,文件名会是乱码,而非对应的中文标签名。

原因

造成问题是原因由于Haskell里写文件的方法。 如下所是,writeFile用base库里的String类型表示文件名, 这就限制其只能表示ASC-II字符集。

type FilePath = String
              
writeFile :: FilePath  -- ^ 文件名
          -> String    -- ^ 要写到文件的内容
          -> IO ()
 

一种解决办法

最直接的方式就是用类库utf8-string2里的encodeString方法,现将文件名进行encode然后再调writeFile方法。比如

import qualified Codec.Binary.UTF8.String as UTF8

main = myWriteFile "新天地.html" "test"
myWriteFile = writeFile . UTF8.encodeString

对应到Hakyll, 就是将上述的改动加到这个文件里src/Hakyll/Core/Writable.hs.详见这里3.

再一种解决办法

hakyll goole groups有人帖了他的一个解决方案,也是用utf8-string先encode,但修改的地方不一样。详见此4