LINUX.ORG.RU

yaws+erlang. Проблема с выводом


0

1

Всем привет. Новичок в erlang. Поставил yaws, решил создать простой сайтик. Есть такая проблема: Получаю данные из БД:

<erl>
        out(A) ->
	application:start(odbc), 
	ConnString = 
	"Driver={MySQL ODBC 5.2 ANSI Driver};" ++
	"Server=127.0.0.1;Database=teamsDatabase;" ++ 
        "User=root;Password=1q2w3e;" ++ 
        "Option=3;", 
        {ok, Conn} = odbc:connect(ConnString, []), 
        Results = odbc:sql_query(Conn, "select * from teams limit 2"), 
        {ehtml,
	        [{h4,[], "The database result:"},
		{hr},
		{ol, [],lists:map(fun(S) -> {li,[], {p,[],S}} end,Results)}]}.
</erl>
В результате получаю вполне логичную ошибку:
ERROR erlang code threw an uncaught exception:
 File: c:/yaws/zero.yaws:39
Class: error
Exception: badarg
Req: {http_request,'GET',{abs_path,"/zero.yaws"},{1,1}}
Stack: [{io_lib,format,
                ["method: ~p",
                 {selected,["id","team_name","wins_count","looses_count",
                            "goals_deals","goals_misses"],
                           [{1,"Команда 1",0,0,0,0},{2,"Команда 2",0,0,0,0}]}],
                [{file,"io_lib.erl"},{line,155}]},
В эрланге мне недостает знаний. Подскажите пожалуйста куда копать или как вывести правильно результат селекта, который я так понимаю выглядит так:
[{1,"Команда 1",0,0,0,0},{2,"Команда 2",0,0,0,0}]
???

Проблема, на самом деле, из-за ненужности Erlang'а для web'а.

anonymous
()

Там же явно указано в чем проблема: Stack: ... io_lib,format ...

Некорректная обработка юникода (кириллица в частности) форматтером io_lib - наиболее вероятна, вернее не тот спецификатор формата или неправильные входные данные для него.

Попробуйте сделать запрос, где содержатся в результатах только ASCII-данные для начала.

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

Вы немного не правы. Разобрался в чем дело. Частично удалось победить:

out(A) ->
        application:start(odbc), 
	ConnString = 
	%"Driver={MySQL ODBC 5.2 ANSI Driver};" ++
	"Driver={MySQL ODBC 5.2 Unicode Driver};" ++
	"Server=127.0.0.1;Database=erandom;" ++ 
	"User=root;Password=1q2w3e;" ++ 
	"Option=3;", 
	{ok, Conn} = odbc:connect(ConnString, []), 
        Results = odbc:sql_query(Conn, "select team_name from teams limit 2"), 
        B = element(3, Results),
        [H|T] = B,
        {ehtml,
		[{h4,[], "The database result:"},
		{hr},
		{ul,[],
		[{text,[], f("~p", [H])},
		{text,[], f(" vs ~p", T)}]}]}.

В итоге, используя драйвер «Driver={MySQL ODBC 5.2 Unicode Driver};» , получаю вывод:

     {<<31,4,64,4,62,4,60,4,53,4,66,4,53,4,57,4>>} vs {<<33,4,17,4,34,4>>}
А используя драйвер «Driver={MySQL ODBC 5.2 ANSI Driver};», получаю вывод:
     {"��������"} vs {"���"}

Вот сейчас гуглю как привести в utf8 и избавиться от символов '{' и '}'

compasses
() автор топика
Ответ на: комментарий от compasses

сейчас гуглю как привести в utf8

обычно/рекомендуется utf8 и/или binary, для вашего примера можно расшифровать так:

io:format("~ts", [unicode:characters_to_list(<<31,4,64,4,62,4,60,4,53,4,66,4,53,4,57,4>>, {utf16, little})]).
Прометейok
Не лучше ли в драйвере указать кодировку?

избавиться от символов '{' и '}'

Это как? мешают?

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

Спасибо за подсказку unicode:characters_to_list - все заработало.

compasses
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.