2

我正在尝试使用 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 字符解析字符串?我的印象是 Haskell 对 unicode 非常好。任何建议将不胜感激!

谢谢,

泰蒂吉

编辑

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

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

x61是 'z' 的 unicode 字符,紧跟在特殊的 unicode 字符之后。不知道为什么它无法读取特殊字符之后的字符!

改为test2be 会test2 = decode $ pack "{ \"foo\": \"bòz\"}"给出错误:

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

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

4

1 回答 1

7

问题是您使用 Char8 模块中的 pack ,它不适用于非拉丁 1 数据。相反,使用encodeUtf8来自文本。

于 2014-12-27T17:47:42.890 回答