SWI-Prolog:如何从转义字符串中获取unicode字符?

时间:2016-10-07 06:40:50

标签: unicode prolog swi-prolog

我有一个问题,我有一个转义字符串,例如“\\ u0026”,我需要将其转换为unicode char'\ u0026'。

欺骗之类的   string_concat('\\',S,“\\ u0026”),写(S)。 没有帮助,因为它将删除\不仅逃脱。所以基本上我的问题是,如何从字符串中删除转义字符。

编辑:哦,我刚注意到,stackoverflow也可以使用escape \。

write_canonical / 1给了我“\\ u0026”,如何将其转换为单个'&'炭?

2 个答案:

答案 0 :(得分:2)

在ISO Prolog中,char通常被认为是长度为1的原子。 原子和字符用单引号括起来,或者不用 如果可能的话引用。以下是一些例子:

?- X = abc.       /* an atom, but not a char */
X = abc
?- X = a.         /* an atom and also a char */
X = a
?- X = '\u0061'. 
X = a

\ u notation是特定于SWI-Prolog的,在ISO中找不到 序言。在SWI-Prolog中,再次找不到数据类型字符串 在ISO Prolog中,并且始终用双引号括起来。这是 一些例子:

?- X = "abc".    /* a string */
X = "abc"
?- X = "a".      /* again a string */
X = "a"
?- X = "\u0061".
X = "a"

如果您手头有一个长度为1的字符串,则可以将其转换为char 通过谓词atom_string/2。这是一个SWI-Prolog特定的谓词, 不在ISO Prolog中:

?- atom_string(X, "\u0061").
X = a
?- atom_string(X, "\u0026").
X = &

一些建议。首先开始学习ISO Prolog原子谓词, 有很多。然后学习SWI-Prolog原子和字符串谓词。

你不必学习这么多新的SWI-Prolog谓词,因为在SWI-Prolog中,大多数ISO Prolog谓词也接受字符串。以下是第一个参数中与字符串一起使用的ISO Prolog谓词atom_codes / 2的示例:

?- atom_codes("\u0061\u0026", L).
L = [97, 38].
?- L = [0'\u0061, 0'\u0026].
L = [97, 38].
?- L = [0x61, 0x26].
L = [97, 38].

P.S:0'表示法在ISO Prolog中定义,它既不是字符,原子或字符串,但它表示整数数据类型。该值是0'后给定char的代码。我把它与SWI-Prolog \ u表示法结合起来。

P.P.S:与\ u表示法连接的0'表示法当然是多余的,在ISO Prolog中,可以直接使用十六进制表示法前缀0x作为整数值。

答案 1 :(得分:0)

事情是,“\\ u0026”已经是你正在寻找的东西,因为它代表了\ u0026。