今天使用http get 方法时,参量中有中文而导致出错。
例如http://abc.com/abc?arg=中文,在erlang使用http:request方法失败。
后来查了url的规范,url中要使用ascii字符,从而写了下面的方法:
lists:append([io_lib:format("%~.16B", [E]) || E <- binary_to_list(unicode:characters_to_binary("中文"))])。
上面转化的字符追加到url末尾就可以了。
使用post方法可以参考:
how to support chinese in http request body? erlang
随机产生包含字符和数字的字符串:
randchar(N) ->
List = randchar(N, []),
lists:foldr(fun(X, Acc) ->
case X > 95 of
true ->
[X] ++ Acc;
false ->
integer_to_list(X) ++ Acc
end
end, [], List).
randchar(0, Acc) ->
Acc;
randchar(N, Acc) ->
randchar(N - 1, [randstr() | Acc]).
randstr() ->
case rand:uniform(9) > 5 of
true ->
rand:uniform(26) + 96;
false ->
rand:uniform(9)
end.
优化了一下,还是不够好。
randchar(N) ->
lists:flatten(randchar(N, [])).
randchar(0, Acc) ->
Acc;
randchar(N, Acc) ->
randchar(N - 1, [randstr() | Acc]).
randstr() ->
case rand:uniform(9) > 5 of
true ->
[rand:uniform(26) + 96];
false ->
integer_to_list(rand:uniform(9))
end.
早上起来,忽然想到,字母是用ascii码表示,数字为啥不用ascii码表示呢?
测试了一下,果然能行,代码如下:
randchar(N) ->
randchar(N, []).
randchar(0, Acc) ->
Acc;
randchar(N, Acc) ->
randchar(N - 1, [randstr() | Acc]).
randstr() ->
case rand:uniform(9) > 5 of
true ->
rand:uniform(26) + 96;
false ->
rand:uniform(10) + 47
end.
因为0的ascii是48,rand:uniform(10)最小是1, 所以数字的增量为47.