Haskell Parsec匹配单个unicode字符

Haskell Parsec匹配单个unicode字符,haskell,unicode,parsec,Haskell,Unicode,Parsec,我正在尝试创建一个解析器(使用parsec),它解析由换行符、逗号、分号和unicode破折号(ndash和mdash)分隔的令牌: authorParser=do 名字适合我: Prelude Text.ParserCombinators.Parsec> let authorName = do { name <- many1 (noneOf ",:\r\n\8212\8213"); many (oneOf ",:-\8212\8213"); } Prelude Text.Parse

我正在尝试创建一个解析器(使用parsec),它解析由换行符、逗号、分号和unicode破折号(ndash和mdash)分隔的令牌:

authorParser=do
名字适合我:

Prelude Text.ParserCombinators.Parsec> let authorName = do { name <- many1 (noneOf ",:\r\n\8212\8213"); many (oneOf ",:-\8212\8213"); }
Prelude Text.ParserCombinators.Parsec> parse authorName "" "my Name,\8212::-:\8213,"
Right ",\8212::-:\8213,"

哪个做对了。
Text.Parsec.ByteString[.Lazy]
中提供的实例没有,它使用的是
数据.ByteString[.Lazy].Char8
接口,因此一个破折号将变成一个单独的“\20”不匹配“\8212”,或者在对
uno
的三个连续调用中产生三个
字符“\226”、“128”和“\148”,根据输入的编码方式,没有一个匹配“\8212”。

Hmm。如果我从(noneOf[…])切换到(noneOf“…”),则会在更早的阶段失败。也许这与ByteString.Lazy有某种联系,我正在使用它?啊<代码>ByteString
,这是一条线索。补充我的答案。谢谢你,我已经设法使Noof/oneOf工作“正确”,至少用通常的字符。但是--我需要为变量长度字符编写自己的uncon吗?不,您可以使用
Data.ByteString[.Lazy].UTF8
包中的
uncon
函数。但是,有两个不同的<代码>流实例不适用于<代码> ByTeStope<代码>和<代码> Char < /代码>(并且它们不能一起使用),因此您应该考虑在<代码> ByTeStord中使用< UTF-8编码> <代码> ByTeStord,制作< <代码> NeXyType <代码>包装器。但是,如果它只是一个永远不会离开您的
$HOME
的快速黑客,那么您可能会很脏,只需编写第二个实例,而忽略
Text.Parsec.ByteString[.Lazy]中的实例
。您应该做一些基准测试,看看当与Parsec一起使用时,使用bytestring-utf8是否比字符串节省了任何东西。我认为编码问题应该是一个新问题,没有足够的空间在注释中处理。
Prelude Text.ParserCombinators.Parsec> let authorName = do { name <- many1 (noneOf ",:\r\n\8212\8213"); many (oneOf ",:-\8212\8213"); }
Prelude Text.ParserCombinators.Parsec> parse authorName "" "my Name,\8212::-:\8213,"
Right ",\8212::-:\8213,"
instance Text.Parsec.Prim.Stream ByteString m Char