Erlang:读取带有非英文字符的文本文件

时间:2014-11-01 15:40:56

标签: erlang

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

任何人都知道如何阅读这样的文件并打印出外国字符?

我在shell中尝试了以下内容:

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

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

希望它有意义。

2 个答案:

答案 0 :(得分:1)

在Erlang中,所有字符串都是数字列表。 REPL尝试通过显示一个ASCII字符串,当它认为它是什么时,以及一个数字列表,当它没有,但这只是一个显示功能。

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

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

答案 1 :(得分:1)

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

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

来显示
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”部分。