【问题标题】:How to set the utf-8 for the code file (.pl) in swi-prolog desktop如何在 swi-prolog 桌面中为代码文件 (.pl) 设置 utf-8
【发布时间】:2021-01-22 19:48:25
【问题描述】:

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

【问题讨论】:

    标签: swi-prolog


    【解决方案1】:

    您可以尝试设置名为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()。这可能与其他语言环境之一相同,特别是 对于西方语言和 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.
    

    【讨论】:

      【解决方案2】:

      对于 SWI-Prolog,有 init.pl 文件,您可以在该文件中设置 encoding 标志。

      打开 swipl-win.exe -> 设置 -> 用户初始化文件...,SWI-Prolog 会提示你创建一个init.pl 文件。在我的电脑里是C:\Users\Chansey\AppData\Roaming\swi-prolog\init.pl

      将以下代码复制到该文件:

      :- set_prolog_flag(encoding, utf8).
      

      重启swipl-win.exeswipl.exe,即可默认加载utf-8编码文件。

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多