【问题标题】:Portable way to change Prolog atom JSON escaping更改 Prolog atom JSON 转义的便携式方法
【发布时间】:2021-07-27 03:29:15
【问题描述】:

是否有一种可移植的方式来更改 Prolog 转义。一世 请记住以下几点,通常一个原子被转义为 如下,例如使用八进制转义:

/* SWI-Prolog 8.3.23 */

?- X = 'abc\x0001\def'.
X = 'abc\001\def'.

但我要归档的是如下输出。 如果使用复合 '$STR'/1,转义应该 是"\uXXXX",而不是八进制转义和双引号:

?- X = '$STR'('abc\x0001\def').
X = "abc\u0001def".

Prolog 系统是否有一些钩子,比如描绘, 能做到吗?我不期望基于 ISO 的方法 核心标准,"\uXXXX" 已经不是 ISO 核心标准了

【问题讨论】:

    标签: prolog swi-prolog unicode-escapes


    【解决方案1】:

    一种可移植的方式是使用 write/1 而不是 writeq/1,并在使用 write/1 之前转换原子本身。转换代码可以使用 ISO 核心标准 atom_codes/2 如下:

    % escape_atom(+Atom, -Atom)
    escape_atom(X, Y) :-
       atom_codes(X, L),
       escape_codes(L, R, [0'"]),
       atom_codes(Y, [0'"|R]).
    

    谓词 escape_codes/2 本身可以很容易地用 DCG 实现,它也可用于许多 Prolog 系统。使用标准算术可以如下提取代理对:

    % high_surrogate(+Integer, -Integer)
    high_surrogate(X, Y) :- Y is (X >> 10) + 0xD7C0.
    
    % low_surrogate(+Integer, -Integer)
    low_surrogate(X, Y) :- Y is (X /\ 0x3FF) + 0xDC00.
    

    以下是例程运行的示例:

    ?- escape_atom('abc\x1000c\def', X), write(X), nl.
    "abc\ud800\udc0cdef"
    X = '"abc\\ud800\\udc0cdef"'
    ?- escape_atom('abc\x1000b\def', X), write(X), nl.
    "abc?def"
    X = '"abc?def"'
    

    唯一缺少的部分是内置的 code_type/2,它应该提供代码点的 unicode 通用类别。然后用于识别控制代码和无效代码,

    只有这些被转义。

    开源:Prolog escape.pl
    https://gist.github.com/jburse/bf6c01c7524f2611d606cb88983da9d6#file-escape-pl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-16
      • 2014-02-17
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多