8

&"<などの文字を含む可能性のあるerlang文字列があります。

1> Unenc = "string & \"stuff\" <".
ok

文字列を解析し、次のような必要なすべてのHTML /XMLエンティティをエンコードするErlang関数がどこかにありますか?

2> Enc = xmlencode(Unenc).
"string &amp; &quot;stuff&quot; &lt;".

私のユースケースは、ユーザー入力から来る比較的短い文字列です。xmlencode関数の出力文字列は、XML属性のコンテンツになります。

<company name="Acme &amp; C." currency="&euro;" />

最終的なXMLは、ネットワークを介して適切に送信されます。

4

3 に答える 3

4

Erlang ディストリビューションには、山括弧とアンパサンドをエスケープする関数がありますが、文書化されていないため、おそらくそれに依存するのは最善ではありません。

1> xmerl_lib:export_text("string & \"stuff\" <").
"string &amp; \"stuff\" &lt;"

(単一の文字列をエンコードするだけでなく) XML 構造を構築/エンコードしたい場合は、xmerl API が適しています。

2> xmerl:export_simple([{foo, [], ["string & \"stuff\" <"]}], xmerl_xml).
["<?xml version=\"1.0\"?>",
 [[["<","foo",">"],
   ["string &amp; \"stuff\" &lt;"],
   ["</","foo",">"]]]]
于 2010-07-26T22:18:15.157 に答える
2

ニーズが単純な場合は、文字列内の文字のマップを使用してこれを行うことができます。

quote($<) -> "&lt;";
quote($>) -> "&gt;";
quote($&) -> "&amp;";
quote($") -> "&quot;";
quote(C) -> C.

それならあなたはするだろう

1> Raw = "string & \"stuff\" <".
2> Quoted = lists:map(fun quote/1, Raw).

ただし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])). 

できれば車輪の再発明はしたくありませんが。

dsmith : 使用している文字列は、通常、Unicode コード ポイントのリスト (つまり、数字のリスト) であるため、特定のバイト エンコーディングは関係ありません。バイナリを直接操作している場合は、特定のエンコーディングについてのみ心配する必要があります。

明確にするために、ユーロ記号の Unicode コードポイント (10 進数 8364) は、リスト内の単一の要素になります。したがって、これを行うだけです:

xmlencode([8364|T], Acc) -> xmlencode(T, Acc ++ "&#8364;"); 
于 2010-07-26T22:06:23.513 に答える
1

含まれている OTP パッケージに含まれているものを知りません。ただし、Mochiweb の mochiweb_html モジュール: エスケープ関数があります:リスト、バイナリ、およびアトムを処理するmochiweb_html.erl 。

また、URL エンコーディングについては、mochiweb_util モジュールをチェックアウトします: mochiweb_util.erlとその urlescape 関数。

これらのライブラリのいずれかを使用して、必要なものを取得できます。

于 2010-07-28T06:04:50.410 に答える