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

问题描述

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

解决方法

您可以尝试设置名为 encodingprolog 标志

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

阅读current_prolog_flag/2

?- 
current_prolog_flag(encoding,X).
X = utf8.

设置它与set_prolog_flag/2

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

那应该是环境变量 LANG(至少在 POSIX 系统上是这样。更多关于这个变量的信息,例如在 GNU gettext manual 中)。在外壳中:

# bash code

$ echo $LANG
en_GB.UTF-8

因此您可能需要检查该环境变量是否影响 swipl

例如,以 swipl 开头:

# bash code

$ LANG=en_GB.ASCII swipl

然后:

?- 
current_prolog_flag(encoding,X).
X = iso_latin_1.

但是 swipl 对常用代码有一些问题:

# bash code

$ LANG=en_GB.ISO-8859-1 swipl

那么:

?- 
current_prolog_flag(encoding,X).
X = text.

这是什么狄更斯? encoding 上的页面列出了有效的编码键,而 ISO-8859-1 不是其中之一。

iso_latin_1:支持多种西方语言的 8 位编码。 这会导致流被完全未翻译地读取和写入。

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

text:文本文件的 C 库默认语言环境编码。文件是 使用 C 库函数 mbrtowc() 和 wcrtomb()。这可能与其他语言环境之一相同,特别是 它可能与西方语言的 iso_latin_1 和 utf8 相同 在 UTF-8 上下文中。

不知道如何解释。

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

# bash code

$ export LANG=en_GB.UTF-8
$ swipl

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

load_files/2 带有选项 encoding

?- 
load_files([foo],[encoding(utf8)]).

测试

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

# bash code

$ echo $LANG
en_GB.UTF-8

$ file citation.pl 
citation.pl: UTF-8 Unicode text

代码

citation :-
   писатель(1,Author),цитирование(1,Citation),format("Author: ~s~nCitation: ~s~n",[Author,Citation]).

% Facts!

писатель(1,"Р.П.Уоррен").
цитирование(1,"Ты должна сделать добро из зла,потому что его больше не из чего сделать.").

因此:

?- 
[citation].
true.

?- 
citation.
Author: Р.П.Уоррен
Citation: Ты должна сделать добро из зла,потому что его больше не из чего сделать.
true.

加载失败:

?- 
load_files([citation],[encoding(ascii)]).
ERROR: citation.pl:2:4: Syntax error: Operator expected
ERROR: citation.pl:8:2: Syntax error: Operator expected
ERROR: citation.pl:9:2: Syntax error: illegal_character
Warning: citation.pl:10:
Warning:    'citation.pl':10:0: non-ASCII character
true.

加载失败:

?- 
load_files([citation],[encoding(iso_latin_1)]).
ERROR: citation.pl:2:4: Syntax error: Operator expected
ERROR: citation.pl:8:2: Syntax error: Operator expected
ERROR: citation.pl:9:2: Syntax error: illegal_character
true.

成功:

?- 
load_files([citation],[encoding(utf8)]).
true.