2014-11-01 118 views
1

我正在尝试使用file:consult/1来读取Erlang条款的文件。但是,该文件在字符串中包含一些非英文字符。所以,当我读取文件时,这些字符串显示为一个数字列表。Erlang:读取非英文字符的文本文件

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

我已经试过了以下的外壳:

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

的结果是,它被保存为一个整数列表,因此,当我尝试做这样的事情ETS:查找()也给了我在shell上返回一个列表。我想看到“some_funny_chars”!

希望它是有道理的。

回答

1

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

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

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

+0

嗨,非常感谢你回答我的问题。我正在使用OTP 17.0。我真的应该澄清我的问题,我尝试通过shell创建一个ETS包,然后尝试插入有趣的字符,然后插入eta:lookup,看看我能否回读。 当我看结果时,它被保存为一个整数列表,因此当我查找它时,结果也是一个整数列表。 这是正常的吗? – xcoder 2014-11-01 18:50:11

+0

我也编辑过这个问题。 Thx再次。 – xcoder 2014-11-01 18:56:45

+0

是的,整数列表是正确的。 zxq9的答案显示了如何为调试/日志打印字符串,但整数列表是每个Erlang字符串实际表示的方式。考虑这一行的结果:'“hello”++ [32,119,111,114,108,100]。(++是append-lists运算符) – 2014-11-02 17:11:06

1

您必须牢记的基本原则是您始终都能看到Unicode。 Unicode是一串数字,没有任何特别的指令,shell就会告诉你:数字串。

可以使用io:format/2

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

更改为

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

有一些基本的编码显示的Unicode你希望(如果你的终端可以打印的字符,这是)的方式将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表,看看有什么,但如果它只是检查值在外壳那么你只需需要从〜p项替换切换到〜tp unicode项替换。实际上,在任何地方使用〜tp并不是一个坏主意,因为它的工作方式与其他数据完全相同(ASCII是UTF-8的子集很方便!)。

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