作为参考,我在Windows 10,64位上使用Prolog v7.4.2
在REPL中输入以下代码:
write("\U0001D7F6"). % Mathematical Monospace Digit Zero
在输出中给出了这个错误:
ERROR: Syntax error: Illegal character code
ERROR: write("
ERROR: ** here **
ERROR: \U0001D7F6") .
我知道U + 1D7F6是一个有效的Unicode字符,所以它有什么用呢?
答案 0 :(得分:3)
SWI-Prolog内部使用C wchar_t
来表示Unicode字符。在Windows上,这些是16位,用于保存UTF-16编码的字符串。然而,SWI-Prolog使用wchar_t
来获得很好的代码点数组,因此实际上只支持Windows上的UCS-2(代码点u0000..uffff
)。
在非Windows系统上,wchar_t
通常为32位,因此支持完整的Unicode范围。
修复处理wchar_t
并不是一件容易的事,因为UTF-16失去了很好的属性,即数组的每个元素都只是一个代码点,使用我们自己的32位类型意味着我们不能使用C库宽字符函数,必须在SWI-Prolog中重新实现它们。这不仅有效,而且用纯C版本替换它们也会失去现代C运行时库中通常存在的优化。
答案 1 :(得分:3)
char代码的ISO核心标准语法看起来不同。以下工作在SICStus Prolog,Jekejeke Prolog,SWI-Prolog等中进行,例如,因此更具便携性:
在Mac上使用SWI-Prolog:
import picture from 'pathToYourPicture';
const {width, height} = Image.resolveAssetSource(picture);
Mac上的Jekejeke Prolog:
Welcome to SWI-Prolog (threaded, 64 bits, version 7.5.8)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
?- set_prolog_flag(double_quotes, codes).
true.
?- X = "\x1D7F6\".
X = [120822].
?- write('\x1D7F6\'), nl.
底层语法可在ISO核心标准的6.4.2.1十六进制转义序列中找到。它的内容如下,并且比U语法短:
Jekejeke Prolog 2, Runtime Library 1.2.2
(c) 1985-2017, XLOG Technologies GmbH, Switzerland
?- X = "\x1D7F6\".
X = [120822]
?- write('\x1D7F6\'), nl.
答案 2 :(得分:1)
为了比较,我得到:
?- write('\U0001D7F6').
你的环境是什么,旗帜说的是什么?
例如:
$ set | grep LANG LANG=en_US.UTF-8
还有:
?- current_prolog_flag(encoding, F). F = utf8.