ett*_*ore 8 xml erlang html-encode xml-encoding
我有一个erlang字符串,可能包含像"&<等等字符:
1> Unenc = "string & \"stuff\" <".
ok
Run Code Online (Sandbox Code Playgroud)
是否有一个Erlang函数可以解析字符串并编码所有需要的HTML/XML实体,例如:
2> Enc = xmlencode(Unenc).
"string & "stuff" <".
Run Code Online (Sandbox Code Playgroud)
?
我的用例是针对相对较短的字符串,来自用户输入.xmlencode函数的输出字符串将是XML属性的内容:
<company name="Acme & C." currency="€" />
Run Code Online (Sandbox Code Playgroud)
最终的XML将通过网络适当发送.
如果您的需求很简单,您可以使用字符串中字符的映射来完成此操作。
quote($<) -> "<";
quote($>) -> ">";
quote($&) -> "&";
quote($") -> """;
quote(C) -> C.
Run Code Online (Sandbox Code Playgroud)
那么你会做
1> Raw = "string & \"stuff\" <".
2> Quoted = lists:map(fun quote/1, Raw).
Run Code Online (Sandbox Code Playgroud)
但Quoted不会是一个平面列表,如果您要将其发送到文件或作为 http 回复,这仍然没问题。即查看 Erlang 的 io-lists。
在最新的 Erlang 版本中,现在有用于多字节 utf8 到宽字节/码点表示的编码-解码函数,请参阅erlang unicode 模块。
重新格式化注释,使代码示例脱颖而出:
ettore:这就是我正在做的事情,尽管我确实必须支持多字节字符。这是我的代码:
xmlencode([], Acc) -> Acc;
xmlencode([$<|T], Acc) -> xmlencode(T, Acc ++ "<"); % euro symbol
xmlencode([226,130,172|T], Acc) -> xmlencode(T, Acc ++ "€");
xmlencode([OneChar|T], Acc) -> xmlencode(T, lists:flatten([Acc,OneChar])).
Run Code Online (Sandbox Code Playgroud)
尽管如果可能的话,我宁愿不要重新发明轮子。
dsmith:您使用的字符串通常是 Unicode 代码点列表(即数字列表),因此任何给定的字节编码都是无关紧要的。如果您直接使用二进制文件,则只需要担心特定的编码。
澄清一下,欧元符号的 Unicode 代码点(十进制 8364)将是列表中的单个元素。所以你只需这样做:
xmlencode([8364|T], Acc) -> xmlencode(T, Acc ++ "€");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2734 次 |
| 最近记录: |