2015-01-15 1 views
1

Я пытаюсь читать символы Юникода (за пределами диапазона latin1) с io:fread.io: fread для символов Unicode не работает с -noshell

Кода ниже штраф в режиме оболочки работы:

Eshell V5.10.4 (abort with ^G) 

1> io:fread("Input some Unicode characters: ", "~ts"). 

Input some Unicode characters: 呵呵 

{ok,[[21621,21621]]} 

При использовании -noshell флага, однако, он возвращает другой список:

$ erl -noshell -eval "io:format(\"~p\", [io:fread(\"Input: \", \"~ts\")])." 

Input: 呵呵 

{ok,[[229,145,181,229,145,181]]} 

Кто-нибудь знает, почему он ведет себя так, как это?

ответ

2

От Эрланга documentation,

Когда Эрланга запускается с -oldshell или -noshell,/вывода-сервер ввода для standard_io установлено значение по умолчанию кодировку побайтно, в то время как интерактивные по умолчанию оболочки к тому, что переменные окружения говорит

с Io: setopts функция/2 вы можете установить кодировку файла или другого I/O-сервер ...

Следовательно, следует добавить io:setopts/2 следующим образом;

$ erl -noshell -eval "io:setopts(standard_io, [{encoding, unicode}]), io:format(\"~p\", [io:fread(\"Input: \", \"~ts\")])." 
Input: 呵呵 
{ok,[[21621,21621]]} 
+0

Спасибо, это работает. Вход идет прямо сейчас, но после того, как я установил параметр кодирования в unicode (или utf8), выход становится беспорядочным. У вас есть какие-то сведения об этом? –

+0

Я не уверен, есть ли другое решение, но бит-синтаксис, похоже, решает проблему. 'erl -noshell -eval" io: setopts ([{encoding, utf8}]), io: format (\ "~ ts ~ n \", [<< \ "Hello world 呵呵 \" >>]). "' – Alper

+0

Я нашел проблему. Я использую Erlang R16, хотя он может компилировать исходные файлы utf-8, он все еще рассматривает все строковые литералы как кодировку latin1. В исходный файл должны быть добавлены комментарии «%% - * - кодирование: utf-8 - * -», тогда могут использоваться строковые литералы utf-8. В R17 кодировка по умолчанию изменилась на utf-8. –

Смежные вопросы