Aeson不会使用unicode字符解码字符串

时间:2014-12-27 16:57:37

标签: haskell unicode aeson

我正在尝试使用Data.Aeson(https://hackage.haskell.org/package/aeson-0.6.1.0/docs/Data-Aeson.html)来解码某些JSON字符串,但它无法解析包含非标准字符的字符串。

例如,文件:

import Data.Aeson
import Data.ByteString.Lazy.Char8 (pack)

test1 :: Maybe Value
test1 = decode $ pack "{ \"foo\": \"bar\"}"

test2 :: Maybe Value
test2 = decode $ pack "{ \"foo\": \"bòz\"}"

在ghci中运行时,会得到以下结果:

*Main> :l ~/test.hs
[1 of 1] Compiling Main             ( /Users/ltomlin/test.hs, interpreted )
Ok, modules loaded: Main.
*Main> test1
Just (Object fromList [("foo",String "bar")])
*Main> test2
Nothing

是否有理由不使用unicode字符解析String?我的印象是Haskell与unicode相当不错。任何建议将不胜感激!

谢谢,

tetigi

修改

使用eitherDecode进一步调查后,收到以下错误消息:

 *Main> test2
 Left "Failed reading: Cannot decode byte '\\x61': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream"

x61是'z'的unicode字符,它紧跟在特殊的unicode字符之后。不确定为什么它没有在特殊字符后读取字符!

test2更改为test2 = decode $ pack "{ \"foo\": \"bòz\"}"会产生错误:

Left "Failed reading: Cannot decode byte '\\xf2': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream"

“ò”的字符是什么,这更有意义。

1 个答案:

答案 0 :(得分:6)

问题是您使用Char8模块中的pack,它不适用于非Latin 1数据。相反,请使用文字中的encodeUtf8