Unicode 使用DCGs解析时处理宽字符

Unicode 使用DCGs解析时处理宽字符,unicode,prolog,swi-prolog,dcg,widechar,Unicode,Prolog,Swi Prolog,Dcg,Widechar,当我深入研究DCG的使用时,我发现自己被宽字符所困扰 我正在尝试编写一个或多或少通用的标记器,并测试它的勇气,我在一篇文章中遇到了这一点。隐藏在文本中的是宽字符Ã 有很长一段时间,我不知所措,无论我尝试了什么样的调整,标记器都只回答为false。当然,我终于明白了:因为我的DCG规则试图通过调用来标记它们的数据,将单词划分为csym类型的连续字符,用char_typeC、punct等分隔标点符号,当它们遇到Ã时失败,表示为[195,131] 在确定了问题之后,我不知道如何干净地处理这些代码序列。

当我深入研究DCG的使用时,我发现自己被宽字符所困扰

我正在尝试编写一个或多或少通用的标记器,并测试它的勇气,我在一篇文章中遇到了这一点。隐藏在文本中的是宽字符Ã

有很长一段时间,我不知所措,无论我尝试了什么样的调整,标记器都只回答为false。当然,我终于明白了:因为我的DCG规则试图通过调用来标记它们的数据,将单词划分为csym类型的连续字符,用char_typeC、punct等分隔标点符号,当它们遇到Ã时失败,表示为[195,131]

在确定了问题之后,我不知道如何干净地处理这些代码序列。理想情况下,我希望将所有图形字符(无论宽度如何)分组为单词的一部分,除非它们是明确的标点符号。我尝试过以各种不同的编码读取文件,但似乎没有帮助,大概是因为我仍然依赖于code_type/2

目前,我设计了以下令人不快的解决方案,作为任何非ascii字符的通用解决方案:

% non ascii's
nasciis([C])     --> nascii(C), (call(eos), !).
nasciis([C]),[D] --> nascii(C), [D], {D < 127}.
nasciis([C|Cs])  --> nascii(C), nasciis(Cs).

nascii(C)        --> [C], {C > 127}.
但我确信,或者至少我希望,有更好的方法来解决这个问题


其他人如何处理这种情况?有没有标准的方法?我忽略了一些简单的事情吗?

你读过这个吗:?不管怎么说,有这些Ã字的目的是什么?一开始的编码似乎有问题?从这个意义上说,我想如果你弄错了也没关系:如何优雅地处理脏的input.PS是一个完全不同的问题。我很确定这个奇怪的字符是由于某个时间点的编码混乱造成的。请记住,字符属性实际上取决于您的区域设置!例如,对我来说,“-code_type0'195”,csym。说的没错,谢谢你,鲍里斯!我看过SWI文档中关于广泛字符支持的内容。后来我在读取数据时尝试了不同的编码,虽然这确实导致了。。。嗯,不同的编码。。。它对解析宽字符没有帮助。我认为你是绝对正确的,在这种情况下,Ã是由于编码错误导致数据损坏,但如果我试图解析,例如twitter流,我会有大量的宽字符。除了我的方法之外,如果能有一种处理这些问题的方法,那就太好了。我也想要一些不受当地限制的东西!感谢您的投入: