如何在 swi-prolog 桌面中设置代码文件 (.pl) 的 utf-8

ilk*_*ury 5 swi-prolog

我正在尝试开发有关使用 swi-prolog 的常见问题(常见问题解答)。我使用桌面版 swi-prolog(AMD64,多线程,版本 8.2.3)。\n常见问题解答中的问题和答案是用土耳其的母语编写的。当我运行代码文件(k-base.pl 和 user.pl)时,土耳其语字符 /like \xc5\x9f-\xc4\x9f-\xc3\xbc-\xc3\xb6/ 看起来已损坏。\n我想知道是否有utf-8 代码文件的任何语法或 swi-prolog 桌面中针对此语言问题的任何设置。

\n

Dav*_*fer 3

您可以尝试设置名为的prolog 标志encoding

\n
\n

用于以文本模式打开文件的默认编码。初始值>是从环境中推导出来的。参见编码有关详细

\n
\n

阅读它与current_prolog_flag/2

\n
?- \ncurrent_prolog_flag(encoding,X).\nX = utf8.\n
Run Code Online (Sandbox Code Playgroud)\n

设置set_prolog_flag/2

\n

文档说该标志的值是在程序启动时从环境中读取的。

\n

这应该是环境变量LANG(至少在 POSIX 系统上)。有关此变量的更多信息,例如在GNU gettext 手册中中)。在外壳中:

\n
# bash code\n\n$ echo $LANG\nen_GB.UTF-8\n
Run Code Online (Sandbox Code Playgroud)\n

所以你可能想检查该环境变量是否影响swipl.

\n

例如,开始swipl从以下内容开始:

\n
# bash code\n\n$ LANG=en_GB.ASCII swipl\n
Run Code Online (Sandbox Code Playgroud)\n

然后:

\n
?- \ncurrent_prolog_flag(encoding,X).\nX = iso_latin_1.\n
Run Code Online (Sandbox Code Playgroud)\n

swipl通常的代码有一些问题:

\n
# bash code\n\n$ LANG=en_GB.ISO-8859-1 swipl\n
Run Code Online (Sandbox Code Playgroud)\n

然后:

\n
?- \ncurrent_prolog_flag(encoding,X).\nX = text.\n
Run Code Online (Sandbox Code Playgroud)\n

这是什么狄更斯?编码页面列出了有效的编码密钥,以及ISO-8859-1不是其中之一。

\n
\n

iso_latin_1:支持许多西方语言的 8 位编码。\n这会导致流完全未翻译地读写。

\n
\n

这意味着一个字节只是扩展为 2 字节(或更大)的内部 Unicode 代码点(尽管应该进行一些过滤?;并非ISO-8859-1中的所有内容都映射到有效的 Unicode 代码点)。

\n
\n

text:C 库文本文件的默认区域设置编码。使用 C 库函数 mbrtowc() 和 wcrtomb() 读取和写入文件。这可能与其他语言环境之一相同,特别是\nit 可能与西方语言的 iso_latin_1 和 UTF-8 上下文中的 utf8\n 相同。

\n
\n

不知道如何解释这一点。

\n

无论如何,要在 bash shell 中设置环境变量:

\n
# bash code\n\n$ export LANG=en_GB.UTF-8\n$ swipl\n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可以使用指定所需编码的选项加载源:

\n

load_files/2与选项encoding

\n
?- \nload_files([foo],[encoding(utf8)]).\n
Run Code Online (Sandbox Code Playgroud)\n

一个测试

\n

我刚刚使用 UTF-8 文件在我的系统上进行了测试,所有内容均设置为默认值:

\n
# bash code\n\n$ echo $LANG\nen_GB.UTF-8\n\n$ file citation.pl \ncitation.pl: UTF-8 Unicode text\n
Run Code Online (Sandbox Code Playgroud)\n

代码

\n
citation :-\n   \xd0\xbf\xd0\xb8\xd1\x81\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c(1,Author),\n   \xd1\x86\xd0\xb8\xd1\x82\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5(1,Citation),\n   format("Author: ~s~nCitation: ~s~n",[Author,Citation]).\n\n% Facts!\n\n\xd0\xbf\xd0\xb8\xd1\x81\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c(1,"\xd0\xa0.\xd0\x9f.\xd0\xa3\xd0\xbe\xd1\x80\xd1\x80\xd0\xb5\xd0\xbd").\n\xd1\x86\xd0\xb8\xd1\x82\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5(1,"\xd0\xa2\xd1\x8b \xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb6\xd0\xbd\xd0\xb0 \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x82\xd1\x8c \xd0\xb4\xd0\xbe\xd0\xb1\xd1\x80\xd0\xbe \xd0\xb8\xd0\xb7 \xd0\xb7\xd0\xbb\xd0\xb0, \xd0\xbf\xd0\xbe\xd1\x82\xd0\xbe\xd0\xbc\xd1\x83 \xd1\x87\xd1\x82\xd0\xbe \xd0\xb5\xd0\xb3\xd0\xbe \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5 \xd0\xbd\xd0\xb5 \xd0\xb8\xd0\xb7 \xd1\x87\xd0\xb5\xd0\xb3\xd0\xbe \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x82\xd1\x8c.").\n
Run Code Online (Sandbox Code Playgroud)\n

因此:

\n
?- \n[citation].\ntrue.\n\n?- \ncitation.\nAuthor: \xd0\xa0.\xd0\x9f.\xd0\xa3\xd0\xbe\xd1\x80\xd1\x80\xd0\xb5\xd0\xbd\nCitation: \xd0\xa2\xd1\x8b \xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb6\xd0\xbd\xd0\xb0 \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x82\xd1\x8c \xd0\xb4\xd0\xbe\xd0\xb1\xd1\x80\xd0\xbe \xd0\xb8\xd0\xb7 \xd0\xb7\xd0\xbb\xd0\xb0, \xd0\xbf\xd0\xbe\xd1\x82\xd0\xbe\xd0\xbc\xd1\x83 \xd1\x87\xd1\x82\xd0\xbe \xd0\xb5\xd0\xb3\xd0\xbe \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5 \xd0\xbd\xd0\xb5 \xd0\xb8\xd0\xb7 \xd1\x87\xd0\xb5\xd0\xb3\xd0\xbe \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x82\xd1\x8c.\ntrue.\n
Run Code Online (Sandbox Code Playgroud)\n

负载失败:

\n
?- \nload_files([citation],[encoding(ascii)]).\nERROR: citation.pl:2:4: Syntax error: Operator expected\nERROR: citation.pl:8:2: Syntax error: Operator expected\nERROR: citation.pl:9:2: Syntax error: illegal_character\nWarning: citation.pl:10:\nWarning:    \'citation.pl\':10:0: non-ASCII character\ntrue.\n
Run Code Online (Sandbox Code Playgroud)\n

负载失败:

\n
?- \nload_files([citation],[encoding(iso_latin_1)]).\nERROR: citation.pl:2:4: Syntax error: Operator expected\nERROR: citation.pl:8:2: Syntax error: Operator expected\nERROR: citation.pl:9:2: Syntax error: illegal_character\ntrue.\n
Run Code Online (Sandbox Code Playgroud)\n

成功:

\n
?- \nload_files([citation],[encoding(utf8)]).\ntrue.\n
Run Code Online (Sandbox Code Playgroud)\n