Prolog中基本多语言平面(BMP)之外的逃脱字符

时间:2017-08-14 14:58:03

标签: unicode prolog swi-prolog unicode-escapes iso-prolog

作为参考,我在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字符,所以它有什么用呢?

3 个答案:

答案 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.