2014-11-01 6 views
1

Я пытаюсь использовать file:consult/1, чтобы прочитать файл терминов Erlang. Однако файл содержит некоторые неанглийские символы в строках. Поэтому, когда я читаю файл, эти строки отображаются в виде списка чисел.Erlang: прочитайте текстовый файл с неанглийскими символами

Кто-нибудь знает, как я могу прочитать такой файл и распечатать иностранные символы?

Я попытался следующее в оболочке:

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

В результате он будет сохранен в виде списка целых чисел и поэтому, когда я пытаюсь сделать что-то вроде ИТС: поиск(), она также дает мне назад список на оболочке. Я хочу увидеть «some_funny_chars»!

Надеюсь, что это имеет смысл.

ответ

1

В Erlang все строки - это списки номеров. REPL пытается помочь, отображая строку ASCII, когда он думает, что это то, что у нее есть, и список чисел, когда это не так, но это просто функция отображения.

Если вы записываете строки обратно в файл или сравниваете их в памяти, вы должны быть в порядке, чтобы обрабатывать все ваши строки одинаково. Иностранные символы будут уродливы, когда нужно отлаживать их, но они должны правильно читать и писать. Я не уверен, что все так просто, если вам нужно хранить строки во внешней базе данных или отправлять их по проводу какой-либо другой службе. В этот момент вам, вероятно, придется самому обрабатывать кодировку.

Для лучшего времени, однако, обратите внимание, что UTF8 is standard in Erlang/OTP 17.0 and beyond. Это означает, что если ваш файл имеет формат UTF8, и вы используете Erlang 17, все будет работать отлично!

+0

Привет, большое спасибо за ответ на мой вопрос. Я использую OTP 17.0. Я должен действительно прояснить свою проблему, я пытаюсь создать мешок ETS через оболочку и попробовать eta: вставить смешные символы, а затем eta: искать и посмотреть, могу ли я прочитать. Когда я смотрю на результат, он сохраняется как список целых чисел, поэтому, когда я смотрю на него, результат также является списком Intergers. Это нормально? – xcoder

+0

Я также отредактировал вопрос. Thx снова. – xcoder

+0

Да, список целых чисел правильный. Ответ zxq9 показывает вам, как красиво печатать строку для вашей отладки/журналов, но список целых чисел - это то, как фактически представлена ​​каждая строка Erlang. Рассмотрим результат этой строки: «hello» ++ [32,119,111,114,108,100] .' (++ - оператор списка добавлений) –

1

Основной принцип, который вы должны помнить, состоит в том, что вы все время видите Unicode. Unicode - это строки чисел, и без какой-либо специальной инструкции оболочка просто покажет вам, что: строки чисел.

Вы можете использовать io:format/2 показать Unicode, как вы ожидаете (если ваш терминал может печатать символы, то есть) путем перехода от

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

в

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

Есть некоторые основные кодировки вещи, которые могут быть полезны при работе с файлами Юникода в качестве данных (я не уверен в том, что 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, это удобно!).

Надеюсь, это приблизит вас к решению. В любом случае, I сильно рекомендуют, чтобы каждый Эрлангер прочитал часть документов «Using Unicode in Erlang».