erlang转化中文为url

本文介绍在Erlang中处理含有中文的URL参数时遇到的问题及解决方案,包括将中文转换为ASCII兼容的格式,确保HTTP请求正确发送。同时分享了随机生成包含字符和数字的字符串的方法。

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

转载于:https://my.oschina.net/u/191928/blog/618642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值