将上标 2 (²) 符号转换为字符串

Fni*_*fni 4 sbcl common-lisp unicode-normalization

我正在尝试从一些 lisp 文件中获取一串代码,以创建 unix 文件名并将其显示在网页上:

\n
(let ((code "(defun \xc2\xb2 (x) (* x x))"))\n (second (read-from-string code)))\n
Run Code Online (Sandbox Code Playgroud)\n

其评估结果为|2|. 事实上,只需键入即可\'\xc2\xb2计算为|2|, 而不是|\xc2\xb2|

\n

code字符串是从文件中读取的。我正在使用 SBCL 2.2.10。

\n

使用此方案,字符串的"x\xc2\xb2"解析方式与字符串相同"x2"

\n
(read-from-string "x\xc2\xb2")\n(read-from-string "x2")\n
Run Code Online (Sandbox Code Playgroud)\n

如何在read-from-string不对字符串中的代码进行修改的情况下做出正确的更改?

\n

小智 5

见教派。SBCL手册7.1.2 。默认情况下,SBCL 扩展读取器以规范化所有符号。您可以通过以下方式防止当前可读表出现这种情况

(setf (sb-ext:readtable-normalization *readtable*) nil)