2011-10-18 17 views
7

मुझे नोड.जेएस वेब सर्वर का उपयोग करते समय POST डेटा में यूटीएफ -8 तारों को डीकोड करने में समस्याएं आ रही हैं।node.js और utf-8

require("http").createServer(function(request, response) { 

    if (request.method != "POST") { 

    response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); 
    response.end('<html>'+ 
     '<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>'+ 
     '<body>'+ 
     '<form method="post">'+ 
     '<input name="test" value="Grüße!"><input type="submit">'+ 
     '</form></body></html>'); 

    } else { 

    console.log("CONTENT TYPE=",request.headers['content-type']); 

    var body=""; 
    request.on('data', function (data) { 
     body += data; 
    }); 

    request.on('end', function() { 
     console.log("POST BODY=",body); 

     response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); 
     response.end("POST DATA:\n"+body+"\n---\nUNESCAPED:\n"+unescape(body)+ 
     "\n---\nHARDCODED: Grüße!"); 
    }); 

    } 

}).listen(11180); 

यह एक स्वसंपूर्ण वेब सर्वर है कि बंदरगाह 11,180 पर सुनता है और एक सरल रूप है कि विशेष वर्ण के साथ एक इनपुट फ़ील्ड के साथ एक HTML पृष्ठ भेजता है:

यह पूरा testcase देखें। सर्वर पर उस फॉर्म को पोस्ट करना एक सादे पाठ प्रतिक्रिया में इसकी सामग्री को गूंज देगा।

मेरी समस्या यह है कि विशेष गुणों को कंसोल पर और न ही ब्राउज़र में ठीक से प्रदर्शित नहीं किया जा रहा है। यह वही है मैं दोनों Firefox और IE के साथ देख रहा है:

POST DATA: 
test=Gr%C3%BC%C3%9Fe%21 
--- 
UNESCAPED: 
test=GrüÃe! 
--- 
HARDCODED: Grüße! 

अंतिम पंक्ति हार्डकोडेड स्ट्रिंग Grüße! कि इनपुट फ़ील्ड का मान से मेल खाना चाहिए (के रूप में सत्यापित करने के लिए कि यह एक प्रदर्शित समस्या नहीं है) है। जाहिर है POST डेटा को यूटीएफ -8 के रूप में नहीं समझा जाता है। फ़ील्ड में डेटा तोड़ने के लिए require('querystring') का उपयोग करते समय भी वही समस्या होती है।

कोई सुराग?

डेबियन पर Node.js v0.4.11 का उपयोग लिनक्स 4, स्रोत कोड utf-8 चारसेट में सहेजा गया है

+0

ठीक है, मैं आंशिक रूप से अपने ही सवाल का जवाब कर सकते हैं: का उपयोग कर 'decodeURIComponent()' 'बजाय unescape की()' कोर समस्या का हल। हालांकि, इसका मतलब है कि 'querytring' नोड.जेएस मॉड्यूल पूरी तरह से बेकार है और मुझे खुद को पार्सिंग करना है। या मैं कुछ mussing हूँ? –

उत्तर

5

यूएसएस UTF-8 वर्णों ascii चारसेट में नहीं मिला रहे हैं, और द्वारा प्रतिनिधित्व किया जा रहा है एकाधिक ascii पात्रों।

http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

सामग्री प्रकार के अनुसार, "आवेदन/x-www फार्म-urlencoded" बाइनरी डेटा या पाठ गैर- ASCII वर्ण युक्त की बड़ी मात्रा में भेजने के लिए अक्षम है। सामग्री प्रकार "मल्टीपार्ट/फॉर्म-डेटा" होना चाहिए जो फ़ॉर्म, गैर-ASCII डेटा, और बाइनरी डेटा वाले फ़ॉर्म सबमिट करने के लिए उपयोग किया जाता है।

<form method="post" enctype="multipart/form-data />" को मल्टीपार्ट करने के लिए फ़ॉर्म पर अपने एनटेक्पी को स्विच करने से टेक्स्ट को यूटीएफ -8 अक्षरों के रूप में सही ढंग से प्रस्तुत किया जाएगा। फिर आपको मल्टीपार्ट प्रारूप को पार्स करना होगा। node-formidable ऐसा करने के लिए सबसे लोकप्रिय lib लगता है।

जैसा कि आपने टिप्पणी में उल्लेख किया है, decodeURIComponent() का उपयोग करना शायद अधिक आसान है। यूनिस्केप मल्टीबाइट वर्णों को संभाल नहीं करता है, और इसके बजाय प्रत्येक बाइट को अपने चरित्र के रूप में दर्शाता है, इसलिए आप जो गड़बड़ देख रहे हैं। http://xkr.us/articles/javascript/encode-compare/

आप एन्कोडिंग को बदलने के लिए बफर का भी उपयोग कर सकते हैं। Overkill इस मामले में, लेकिन अगर आप की जरूरत:

new Buffer(myString, 'ascii').toString('utf8'); 
+0

नोड-भयानक संकेत के लिए बहुत बहुत धन्यवाद! –

+0

मुझे यह जवाब मेरी दीवार पर चिपका देना चाहिए। – simo