SWI-Prolog: How to get unicode char from escaped string?

。_饼干妹妹 提交于 2019-12-12 20:09:01

问题


I have a problem, I've got an escaped string for example "\\u0026" and I need this to transform to unicode char '\u0026'.

Tricks like string_concat('\\', S, "\\u0026"), write(S). didn't help, because it will remove \ not only the escape . So basically my problem is, how to remove escape chars from the string.

EDIT: Oh, I've just noticed, that stackoverflow also plays with escape \.

write_canonical/1 gives me "\\u0026", how to transform that into a single '&' char?


回答1:


In ISO Prolog a char is usually considered an atom of length 1. Atoms and chars are enclosed in single quotes, or written without quotes if possible. Here are some examples:

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

The \u notation is SWI-Prolog specific, and not found in the ISO Prolog. In SWI-Prolog there is a data type string again not found in the ISO Prolog, and always enclosed in double quotes. Here are some examples:

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

If you have a string at hand of length 1, you can convert it to a char via the predicate atom_string/2. This is a SWI-Prolog specific predicate, not in ISO Prolog:

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

Some recommendation. Start learning the ISO Prolog atom predicates first, there are quite a number. Then learn the SWI-Prolog atom and string predicates.

You dont have to learn so many new SWI-Prolog predicates, since in SWI-Prolog most of the ISO Prolog predicates also accept strings. Here is an example of the ISO Prolog predicate atom_codes/2 used with a string in the first argument:

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

P.S: The 0' notation is defined in the ISO Prolog, its neither a char, atom or string, but it represents an integer data type. The value is the code of the given char after the 0'. I have combined it with the SWI-Prolog \u notation.

P.P.S: The 0' notation in connection of the \u notation is of course redundant, in ISO Prolog one can directly use the hex notation prefix 0x for integer values.




回答2:


The thing is that "\\u0026" is already what you are searching for because it represents \u0026.



来源:https://stackoverflow.com/questions/39910950/swi-prolog-how-to-get-unicode-char-from-escaped-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!