2011-10-18 11 views
7

Node.JS Webサーバーを使用しているときに、POSTデータのUTF-8文字列を解読する際に問題が発生しています。POSTデータの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); 

これは、ポート11180でリッスンし、特殊文字を入力フィールドが含まれている簡単なフォームでHTMLページを送信し、スタンドアロンのWebサーバです。そのフォームをサーバーにポストすると、その内容がプレーンテキストの応答でエコーされます。

私の問題は、特殊文字がコンソールやブラウザに正しく表示されていないことです。これは私がFirefoxとIEの両方で見たものである。

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

最後の行は(それが表示問題ではないことを確認すると)、入力フィールドの値と一致する必要があり、ハードコード文字列Grüße!です。明らかに、POSTデータはUTF-8として解釈されません。 require('querystring')を使用してデータをフィールドに分割しても同じ問題が発生します。

ヒント? Linuxの4のDebian上のNode.jsのv0.4.11を使用

は、ソースコードは、UTF-8文字セットに保存され UTF-8文字は、ASCII文字セットにはない、で表されている

+0

さて、私は、部分的に自分の質問に答えることができます。しかし、これは、 'querytring' Node.JSモジュールがまったく役に立たないことを意味し、私は自分自身でパースを行う必要があります。それとも私は何か騒がしいですか? –

答えて

5

USS複数のASCII文字。 http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

によれば、コンテンツタイプ "アプリケーション/ x-www-form-urlencodedで"

は 非ASCII文字を含むバイナリデータまたはテキストを大量に送信するため 非効率的です。コンテンツタイプ「multipart/form-data」は、ファイル、ASCII以外のデータ、および のバイナリデータを含むフォームの送信には である必要があります。

フォームのenctypeをマルチパート<form method="post" enctype="multipart/form-data />"に切り替えると、正しくテキストがUTF-8文字としてレンダリングされます。その後、マルチパート形式を解析する必要があります。 node-formidableはそうするために最も人気のあるlibのようです。

コメントで述べたようにdecodeURIComponent()を使用する方がはるかに簡単です。 Unescapeはマルチバイト文字を扱うのではなく、各バイトを独自の文字として表現するので、あなたが見ている文字化けが起こります。 http://xkr.us/articles/javascript/encode-compare/

バッファを使用してエンコードを変更することもできます。あなたが必要な場合はやり過ぎ、この場合には、しかし:使用 `は、decodeURIComponent()`の代わりに `アンエスケープ()`コアの問題を解決:

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

ノードの恐ろしいヒントに感謝します! –

+0

私はこの回答を私の壁に貼り付けるべきです。 – simo

関連する問題