2014-11-01 49 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」部分。