2011-10-18 18 views
7

Node.JS web sunucusunu kullanırken POST verilerinde UTF-8 dizelerinin kodunu çözme sorunları yaşıyorum.node.js ve POST verisinde 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); 

Bu port 11180 dinler ve özel karakterler ile bir giriş alanı içeren basit formu ile bir HTML sayfası gönderir bağımsız bir web sunucusudur:

bu eksiksiz TestCase bakın. Bu formun sunucuya gönderilmesi, içeriğini düz metin yanıtında yansıtacaktır.

Sorunum, özel çakılların ne konsolda ne de tarayıcıda düzgün görüntülenmemesidir. Bu benim FireFox ve IE ile gördükleri şeydir:

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

Son satır (bir görüntüleme sorun olmadığını doğrulamak için gibi) giriş alanının değerini aynı olmalıdır kodlanmış dize Grüße! olduğunu. Açıkçası, POST verileri UTF-8 olarak yorumlanmamıştır. Verileri alanlara ayırmak için require('querystring') kullanırken aynı sorun oluşur.

Herhangi bir ipucu? Linux 4 Debian'daki node.js v0.4.11 kullanma

, kaynak kodu utf-8 charset kaydedilir UTF-8 karakter ASCII karakter setinde bulunmayan ve temsil ediliyor

+0

Tamam, kısmen kendi soruya cevap verebilir: kullanarak 'decodeURIComponent()' yerine Unescape 'ait()' çekirdek sorunu çözer. Ancak, bu 'querytring' Node.JS modülü tamamen işe yaramaz ve ben kendimi ayrıştırma yapmak zorunda olduğu anlamına gelir. Yoksa ben bir şey mi içiyorum? –

cevap

5

USS çoklu ascii karakterler. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

içerik türü göre

"uygulama/x-www-form-urlencoded" ASCII olmayan karakterleri içeren ikili veri veya metin büyük miktarlarda göndermek için verimsizdir. "Multipart/form-data" içerik türü, dosyaları, ASCII olmayan verileri ve ikili verileri içeren formları göndermek için kullanılan olmalıdır.

<form method="post" enctype="multipart/form-data />" doğru UTF-8 karakter olarak metin oluşturmak olacaktır multipart form üzerinde sizin enctype Switching. Daha sonra multipart formatını ayrıştırmak zorundasınız. node-formidable bunu yapmak için en popüler kitap gibi görünüyor.

Bir yorumda belirtildiği gibi decodeURIComponent() kullanmak muhtemelen çok daha kolay. Unescape, çok baytlı karakterleri işlemez ve bunun yerine, her baytı kendi karakterini, dolayısıyla gördüğünüz çöplüğü temsil eder. http://xkr.us/articles/javascript/encode-compare/

Kodlamayı değiştirmek için arabellekleri de kullanabilirsiniz. Eğer gerekirse Overkill bu durumda, ancak:

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

Düğümlü bir ipucu için çok teşekkürler! –

+0

Bu cevabı duvarımın üzerine yapıştırmalıyım. – simo