erlang转化中文为url

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

相关文章
相关标签/搜索