今天使用http get 方法时,参量中有中文而致使出错。shell
例如http://abc.com/abc?arg=中文,在erlang使用http:request方法失败。app
后来查了url的规范,url中要使用ascii字符,从而写了下面的方法:post
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? erlangurl
随机产生包含字符和数字的字符串:code
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.
优化了一下,仍是不够好。orm
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码表示呢?ci
测试了一下,果真能行,代码以下:unicode
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.