1.用io:format/2的~p打印中文,出来的是unicode编码的list;
用io:format/2的~ts打印中文,就可以打印出中文
1> io:format("test===~p~n",["测试"]).
test===[27979,35797]
ok
2> io:format("test====~ts~n",["测试"]).
test====测试
ok
2.代码中的中文都是以utf8编码过的,即把unicode编码过的list再次用utf8编码
3> xmerl_ucs:to_utf8([27979,35797]).
[230,181,139,232,175,149]
可以看到utf8编码后是一个0-255数组成的一个list,这是项目中经常输出的中文字符的日志。
3.为了输出中文,需要把utf8转换成unicode编码,即
4> unicode:characters_to_list(list_to_binary([230,181,139,232,175,149])).
[27979,35797]
5> io:format("test===~ts~n",[[27979,35797]]).
test===测试
ok
为了方便,写成一个方法,可以在项目中直接调用。
-module(print_log).
-export([log/2,
test/0]).
log(Format, Data)->
L = get_format_list(Format),
DataList=
lists:map(
fun({1, X}) ->
unicode:characters_to_list(iolist_to_binary(X));
({0, X}) ->
X
end, lists:zip(L, Data)),
io:format(Format,DataList).
get_format_list(Format) ->
get_format_list(Format, []).
get_format_list([], Acc) ->
Acc;
get_format_list([$~|L], Acc) ->
case L of
"ts" ++ Other ->
get_format_list(Other, Acc ++ [1]);
"n" ++ Other ->
get_format_list(Other, Acc);
_ ->
get_format_list(L, Acc ++ [0])
end;
get_format_list([_H|L],Acc) ->
get_format_list(L, Acc).
test()->
log("test===~ts",["测试"]).