【问题标题】:Erlang: read a text file with non-English charactersErlang:读取非英文字符的文本文件
【发布时间】:2014-11-02 19:14:42
【问题描述】:

我正在尝试使用 file:consult/1 来读取 Erlang 术语的文件。但是,该文件在字符串中包含一些非英文字符。因此,当我读取文件时,这些字符串会显示为数字列表。

有人知道我如何读取这样的文件并打印出外来字符吗?

我在 shell 中尝试了以下方法:

ets:new(myTable, [bag,named_table]).
ets:insert(myTable, {"some_funny_chars"}).

结果是它被保存为整数列表,因此当我尝试执行 ets:lookup() 之类的操作时,它还会在 shell 上返回一个列表。我想看“some_funny_chars”!

希望它有意义。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您必须牢记的基本原则是,您一直都在看到 Unicode。 Unicode 是数字字符串,没有任何特殊说明,shell 只会显示:数字字符串。

    您可以使用 io:format/2 以您期望的方式显示 Unicode(如果您的终端可以打印字符,即)通过更改 from

    io:format("Print a term: ~p~n", [Term])
    

    io:format("Print a Unicode term: ~tp~n", [UnicodeTerm])
    

    在将 Unicode 文件作为数据处理时,有一些基本的编码方法很有用(不过,我不确定 file:consult/1 是否会使用 Erlang 术语)。这是一个存根模块,您可以在此基础上进行 file_read 和 file_write:

    %% Beginnings of a utf8 file I/O module
    %% -*- coding: utf8 -*-
    
    -module(u_file).
    -export([write_file/2, read_file/1]).
    
    write_file(Filename, UTF8_data) ->
        file:write_file(Filename, unicode:characters_to_binary(UTF8_data, utf8)).
    
    read_file(Filename) ->
        case file:read_file(Filename) of
            {ok, Data} -> {ok, unicode:characters_to_list(Data, utf8)};
            Other -> Other
        end.
    

    我不确定您需要从 ETS 表中看到什么,但如果它只是检查 shell 中的值,那么您只需从 ~p 术语替换切换到 ~tp unicode 术语替换。实际上,在任何地方都使用 ~tp 并不是一个坏主意,因为它的工作方式与 ~p 在其他数据上的工作方式完全相同(ASCII 作为 UTF-8 的子集很方便!)。

    希望这能让您更接近解决方案。无论如何,我强烈建议每个 Erlanger 阅读文档的“Using Unicode in Erlang”部分。

    【讨论】:

      【解决方案2】:

      在 Erlang 中,所有字符串都是数字列表。 REPL 试图通过显示一个 ASCII 字符串来提供帮助,当它认为它拥有它时显示一个 ASCII 字符串,而当它没有它时显示一个数字列表,但这只是一个显示功能。

      如果您将字符串写回文件或在内存中比较它们,您应该可以将所有字符串视为相同。调试时外来字符看起来很难看,但它们应该正确读写。如果您需要将字符串存储在外部数据库中或通过网络将它们发送到其他服务,我不确定事情是否如此简单。到那时,您可能需要自己处理编码。

      不过,为了更好的时间,请注意UTF8 is standard in Erlang/OTP 17.0 and beyond。这意味着,如果您的文件是 UTF8 格式并且您使用的是 Erlang 17,那么一切都会很好!

      【讨论】:

      • 您好,非常感谢您回答我的问题。我正在使用 OTP 17.0。我真的应该澄清我的问题,我尝试通过外壳创建一个 ETS 包并尝试 eta:insert 有趣的字符,然后 eta:lookup 看看我是否可以读回。当我查看结果时,它会保存为整数列表,因此当我查看结果时,结果也是整数列表。这正常吗?
      • 是的,整数列表是正确的。 zxq9 的答案向您展示了如何为调试/日志漂亮地打印字符串,但整数列表是每个 Erlang 字符串的实际表示方式。考虑这一行的结果:"hello" ++ [32,119,111,114,108,100].(++ 是附加列表运算符)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2012-05-09
      • 2012-08-21
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多