问题描述
我正在尝试开发有关使用 swi-prolog 的常见问题解答 (faq)。我将 swi-prolog 用于桌面(AMD64,多线程,版本 8.2.3)。 常见问题解答中的问题和答案是用土耳其的母语编写的。当我运行代码文件(k-base.pl 和 user.pl)时,土耳其语字符 /like ş-ğ-ü-ö/ 看起来已损坏。 我想知道utf-8的代码文件是否有任何语法或swi-prolog桌面中针对此语言问题的任何设置。
解决方法
您可以尝试设置名为 encoding
的 prolog 标志。
用于以文本模式打开文件的默认编码。初始值 > 是从环境中推导出来的。有关详细信息,请参阅 encoding。
?-
current_prolog_flag(encoding,X).
X = utf8.
文档说该标志的值是在程序启动时从环境中读取的。
那应该是环境变量 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.