SWI序言:如何从转义字符串中获取unicode字符?

SWI序言:如何从转义字符串中获取unicode字符?,unicode,prolog,swi-prolog,Unicode,Prolog,Swi Prolog,我有一个问题,我有一个转义字符串,例如“\\u0026”,我需要它转换为unicode字符'\u0026' 像这样的把戏 字符串\u concat('\\',S,“\\u0026”),写入。 没有帮助,因为它将删除\而不仅仅是转义。所以基本上我的问题是,如何从字符串中移除转义符 编辑:哦,我刚刚注意到,stackoverflow也在玩escape\ write_canonical/1告诉我“\\u0026”,如何将其转换为单个“&”字符?问题是“\\u0026”已经是您正在搜索的内容,因为它代表

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

像这样的把戏 字符串\u concat('\\',S,“\\u0026”),写入。 没有帮助,因为它将删除\而不仅仅是转义。所以基本上我的问题是,如何从字符串中移除转义符

编辑:哦,我刚刚注意到,stackoverflow也在玩escape\


write_canonical/1告诉我“\\u0026”,如何将其转换为单个“&”字符?

问题是“\\u0026”已经是您正在搜索的内容,因为它代表\u0026。

在ISO Prolog中,字符通常被视为长度为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
?- X = "abc".    /* a string */
X = "abc"
?- X = "a".      /* again a string */
X = "a"
?- X = "\u0061".
X = "a"
\u是特定于SWI Prolog的,在ISO中找不到 序言。在SWI Prolog中,再次未找到数据类型字符串 在ISO序言中,并始终用双引号括起来。这是 一些例子:

?- X = abc.       /* an atom, but not a char */
X = abc
?- X = a.         /* an atom and also a char */
X = a
?- X = '\u0061'. 
X = a
?- X = "abc".    /* a string */
X = "abc"
?- X = "a".      /* again a string */
X = "a"
?- X = "\u0061".
X = "a"
如果手头有一个长度为1的字符串,可以将其转换为字符 通过谓词。这是一个特定于SWI Prolog的谓词, 不在ISO序言中:

?- atom_string(X, "\u0061").
X = a
?- atom_string(X, "\u0026").
X = &
一些建议。首先开始学习ISO Prolog atom谓词, 有很多。然后学习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].
注:0'表示法是在ISO Prolog中定义的,它既不是字符、原子也不是字符串,而是表示整数数据类型。该值是0'后面给定字符的代码。我已将其与SWI Prolog\u符号相结合


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

我真的很难理解您的问题。你能试着用不同的方式表述它吗?什么是“转义字符串”?您是否尝试过使用
string\u chars/2
?你说的是数据类型的字符串还是某种字符串文字?(提示:您可以尝试对
内联代码使用反勾号。您只需将
write\u canonical/1
的输出粘贴到您最初拥有的字符串。它是
“&”
还是
“\\u0026”
?如果你用符号
'\x17f\'
代替!因此
?-'\x17f\'=ſ。
成立!转义字符串的格式很糟糕,我的意思是转义字符,就像你不能在中写入'\',但你必须在之前添加转义字符,所以'\'。问题是,write\u canocial将写入“\\u0026”,我不知道如何将其转换为“&”。是的,但问题是,我只有像“\\u0026”一样可用,我不知道如何将其更改为“&”。谢谢,很好的解释。但我仍然不确定如何转换此“\\u0026”-这是SWI Prolog中的字符串,编写_canonical/1给了我一个字符-“&”。这不是一个unicode代码,因为\被另一个\转义。我希望这次我解释得更好。&是一个unicode字符,甚至是ascii字符:在ISO术语中,如果你想编写代码,可以使用字符和代码在编写规范/1或直接使用0x表示法之前,您还可以在ISO Prolog中输入十六进制数。如果您有一个长度为4的原子,如“0026”,并希望将其从十六进制转换为十进制,您可以查看DCG,definite子句语法。或直接编写谓词,如在您将其转换为十进制后的此处可以使用谓词char_code/2。哦,对了!好主意,我想在Prolog中做一个很好的练习,将十六进制转换为十进制或其他方式。(主要问题是,我不知道字符代码是十进制的Unicode,谢谢!)它取决于Prolog系统,在一些Prolog系统中,人们甚至可以选择不同的编码。在SWI Prolog中,他们使用unicode。ISO Prolog只需要ASCII。其他所有内容都是特定于实现的扩展。