今天使用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.