您可以尝试设置名为encoding 的prolog 标志。
用于以文本模式打开文件的默认编码。初始值 > 是从环境中推导出来的。详情请见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()。这可能与其他语言环境之一相同,特别是
对于西方语言和 utf8,它可能与 iso_latin_1 相同
在 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.