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.

相關文章
相關標籤/搜索