如何在Erlang中对字符串进行XML编码?

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 &amp; &quot;stuff&quot; &lt;".
Run Code Online (Sandbox Code Playgroud)

我的用例是针对相对较短的字符串,来自用户输入.xmlencode函数的输出字符串将是XML属性的内容:

<company name="Acme &amp; C." currency="&euro;" />
Run Code Online (Sandbox Code Playgroud)

最终的XML将通过网络适当发送.

Chr*_*ian 2

如果您的需求很简单,您可以使用字符串中字符的映射来完成此操作。

quote($<) -> "&lt;";
quote($>) -> "&gt;";
quote($&) -> "&amp;";
quote($") -> "&quot;";
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 ++ "&lt;"); % euro symbol
xmlencode([226,130,172|T], Acc) -> xmlencode(T, Acc ++ "&#8364;");
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 ++ "&#8364;"); 
Run Code Online (Sandbox Code Playgroud)