2010-07-26 18 views
8

मैं एक erlang स्ट्रिंग जो की तरह & "< और इतने पर वर्ण हो सकते हैं है:मैं एर्लांग में एक स्ट्रिंग को एक्सएमएल-एन्कोड कैसे करूं?

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

वहाँ एक Erlang समारोह कहीं कि स्ट्रिंग को पार्स करता है और इस तरह के रूप में सभी आवश्यक HTML/एक्सएमएल संस्थाओं, encodes है:

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

?

मेरे उपयोग के मामले अपेक्षाकृत कम तार है, जो उपयोगकर्ता इनपुट से आते हैं के लिए है। xmlencode फ़ंक्शन के परिणाम का तार पर एक्सएमएल की सामग्री हो जाएगा श्रद्धांजलि:

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

अंतिम एक्सएमएल उचित रूप से तार पर भेजा जाएगा।

+0

बस यह सुनिश्चित करने के लिए कि आप यह जानते हैं: यूआरएल एन्कोडिंग! = एक्सएमएल एन्कोडिंग – ZeissS

उत्तर

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 की आईओ-सूचियां देखें।

हाल ही में एर्लांग रिलीज में, अब multibyte utf8 के लिए एन्कोड-डीकोड फ़ंक्शन विस्तृत-बाइट/कोडपॉइंट प्रस्तुतियों के लिए हैं, erlang unicode module देखें।


पुन: स्वरूपित टिप्पणी, कोड उदाहरण बनाने के लिए बाहर खड़े:

Ettore: यह, मैं क्या कर रहा हूँ की तरह है, हालांकि मैं multibyte वर्णों का समर्थन करते की क्या ज़रूरत है। यहां मेरा कोड है:

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: जो स्ट्रिंग आप उपयोग कर रहे हैं वह आम तौर पर यूनिकोड कोड-पॉइंट्स (यानी संख्याओं की एक सूची) की एक सूची होगी, और इसलिए कोई भी बाइट एन्कोडिंग अप्रासंगिक है। यदि आप सीधे बाइनरी के साथ काम कर रहे हैं तो आपको केवल विशिष्ट एन्कोडिंग के बारे में चिंता की आवश्यकता होगी।

स्पष्टीकरण के लिए, यूरो प्रतीक (दशमलव 8364) के लिए यूनिकोड कोड-पॉइंट आपकी सूची में एक ही तत्व होगा। तो तुम सिर्फ इस करना होगा:

xmlencode([8364|T], Acc) -> xmlencode(T, AcC++ "&#8364;"); 
+0

यह वही है जो मैं कर रहा हूं, हालांकि मुझे मल्टीबाइट वर्णों का समर्थन करना है। यहां मेरा कोड है: xmlencode ([], एसीसी) -> एसीसी; xmlencode ([$ <|T], Acc) -> xmlencode (टी, एसीसी ++ "<"); % यूरो प्रतीक xmlencode ([226,130,172 | टी], एसीसी) -> xmlencode (टी, एसीसी ++ "€"); xmlencode ([OneChar | टी], एसीसी) -> xmlencode (टी, सूचियां: flatten ([Acc, OneChar])) हालांकि यदि संभव हो तो मैं पहिया को फिर से शुरू नहीं करना चाहूंगा। – ettore

+0

@ettore - स्ट्रिंग आप आम तौर पर यूनिकोड कोड-पॉइंट्स (यानी संख्याओं की एक सूची) की एक सूची होगी, और इसलिए कोई भी बाइट एन्कोडिंग अप्रासंगिक है। यदि आप सीधे बाइनरी के साथ काम कर रहे हैं तो आपको विशिष्ट एन्कोडिंग के बारे में चिंता की आवश्यकता होगी। – dsmith

+0

स्पष्टीकरण के लिए यूरो प्रतीक के लिए यूनिकोड कोड-पॉइंट (दशमलव 8364) आपकी सूची में एक ही तत्व होगा। तो आप बस यह करेंगे: xmlencode ([8364 | टी], एसीसी) -> xmlencode (टी, एसीसी ++ "€"); – dsmith

4

वहाँ Erlang वितरण कि कोण कोष्ठक और ऐम्परसेंड निकल जाता है में एक समारोह है लेकिन यह इतना शायद दर्ज नहीं किया गया है उस पर भरोसा करने के लिए नहीं सबसे अच्छा:

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

यदि आप एक्सएमएल संरचनाओं को बनाने/एन्कोड करना चाहते हैं (केवल एक स्ट्रिंग को एन्कोड करने की बजाय), तो xmerl एपीआई एक अच्छा विकल्प होगा, उदाहरण के लिए

2> xmerl:export_simple([{foo, [], ["string & \"stuff\" <"]}], xmerl_xml). 
["<?xml version=\"1.0\"?>", 
[[["<","foo",">"], 
    ["string &amp; \"stuff\" &lt;"], 
    ["</","foo",">"]]]] 
+0

मैंने कोशिश की लेकिन दुर्भाग्यवश यह <> और के बगल में बहुत कम समर्थन है। मैं एक ऐसे फ़ंक्शन की तलाश में हूं जो किसी दिए गए एन्कोडिंग के अंदर वर्णों की एक विस्तृत विविधता को एन्कोड कर सके: उच्चारण अक्षरों, कॉपीराइट, मुद्राएं (उदाहरण: यूरो €) और इसी तरह। – ettore

+1

तो क्या आप PHP की htmlentities जैसे फ़ंक्शन चाहते हैं, न कि PHP के htmlspecialchars? मैं इसे http://htmlentities.rubyforge.org/ या http://phpjs.org/functions/htmlentities –

1

मुझे शामिल ओटीपी पैकेजों में से एक के बारे में पता नहीं है।हालांकि Mochiweb के mochiweb_html मॉड्यूल: एक भागने का कार्य है: mochiweb_html.erl यह सूचियों, द्विआधारी, और परमाणुओं को संभालता है।

और यूआरएल एन्कोडिंग चेकआउट के लिए mochiweb_util मॉड्यूल: mochiweb_util.erl इसके यूआरएलस्केप फ़ंक्शन के साथ।

आप जो भी चाहते हैं उसे पाने के लिए आप उन पुस्तकालयों में से किसी एक का उपयोग कर सकते हैं।

+0

जैसे कुछ से पोर्ट करता हूं धन्यवाद, मैंने mochiweb_html पर एक नज़र डाली: बचें, हालांकि ऐसा लगता है कि यह भाग निकलता है केवल पूर्वनिर्धारित इकाइयां। किसी अन्य पात्र, जो भी बाइट सामग्री हो सकती है, तब तक छोड़ी जा सकती है जब तक कि मुझे कुछ याद नहीं आया: escape_attr ([सी | आराम], एसीसी) -> escape_attr (बाकी, [सी | एसीसी])। अच्छी तरह से गठित एक्सएमएल विशेषताओं के निर्माण के उद्देश्य के लिए यह पर्याप्त है मुझे लगता है? – ettore

+0

अच्छी तरह से गठित एक्सएमएल बनाने के लिए पर्याप्त है। हालांकि यह आपकी बचपन की जरूरतों का समर्थन करने के लिए पर्याप्त हो सकता है या नहीं। यदि आपके पास एप्लिकेशन विशिष्ट बचने की ज़रूरत है तो आपको उन्हें स्वयं लागू करने की आवश्यकता हो सकती है। –

संबंधित मुद्दे