2016-08-11 4 views
2

데이터를 urlencoding하기 위해 windows-1252 charset을 사용하도록 설정된 양식을 게시해야합니다. 간단한 문자의 경우 기본 인코딩 (utf8)이 작동하지만 필수 문자 세트로 인코딩해야하는 특수 문자입니다.node.js의 windows-1252 charset을 사용하여 양식 데이터를 urlencoding

내가 사용중인 npm "request"패키지는 특정 charset을 설정할 수 없으며 기본적으로 아래에 utf8을 사용합니다. 나는 다른 패키지 "Restler"를 설정했는데 인코딩을 설정할 수 있었지만 windows-1252 (Node는 소수의 인코딩 문자 (버퍼 클래스) 만 제공하고 Windows-1252는 그 중 하나가 아님)를 지정할 때 잘못된 charset을 말하는 예외를 throw합니다. .

노드에서 달성 할 수 있는지 여부도 알려주세요. 확인을 위해 자바에서 약간의 클라이언트를 생성하고 아파치의 http 클라이언트 라이브러리를 windows-1252 인코딩과 함께 사용했으며 내 요청이 서버에 의해 성공적으로 승인되었습니다. 지금까지, 나는 이것을 노드에서 파악할 수 없었다.

+0

아니 현대의 웹 서버가 UTF-8로 인코딩 된 URL을 처리 할 수 ​​없습니다. 이 요구 사항에 대해 확신합니까? – Tomalak

+0

예, 확신합니다. 나는 자바 클라이언트와 내 요청을 보낼 관리 내 OP에서 언급. 해당 자바 클라이언트에서 utf8을 설정하면 서버가 데이터를 올바르게 디코딩하지 못합니다. 또한 서버가 응답으로 보내는 html 페이지는 windows-1252 charset을 사용하도록 설정됩니다. –

+0

호기심에서 서버가 무엇입니까? – Tomalak

답변

3

Windows-1252와 같은 레거시 인코딩에서 HTTP 요청 데이터를 보내는 것은 이러한 인코딩에 대한 기본 지원이 없으므로 노드에서 간단하지 않습니다.

지원은 iconv 라이브러리 형식으로 추가 할 수 있으므로 상자에서 작동하지 않을지라도 확실히 수행 할 수 있습니다.

다음 대상은 restler입니다. 사용하고 있기 때문에이 원칙은 모든 클라이언트 HTTP 라이브러리에 적용됩니다.

주 :

  • 전통적인 HTTP POST를 우리가 이것에 대한 qs를 사용, URL 인코딩입니다.
  • UTF-8 이외의 인코딩에 대한 지원은 qs - Dealing with special character sets에 설명되어있는 qs-iconv에 의해 제공됩니다.
  • Restler는 문자열 또는 일반 객체로 전달하는 경우 데이터를 UTF-8로 인코딩하지만, Buffer을 전달하면 Restler가 그대로 전송합니다.
  • Content-TypeContent-Length을 올바르게 설정하면 수신 측에서 데이터를 올바르게 해석 할 수 있습니다. 여기에 우리 자신의 데이터를 제공하기 때문에 우리는이 헤더를 수동으로 설정해야합니다.
  • (이 경우에 윈도우 1252) 대상 캐릭터 세트에 포함되지 않는 모든 문자 가 (URL 형태로 %3F)의 iconv에 의해 ?로 인코딩 것 때문에 손실된다는 점에 유의해야합니다.

코드 :

var rest = require('restler'); 
var qs = require('qs'); 
var win1252 = require('qs-iconv/encoder')('win1252'); 

var requestData = { 
    key1: "‘value1‘", 
    key2: "‘value2‘" 
}; 

var requestBody = qs.stringify(requestData, { encoder: win1252 }); 
// => "key1=%91value1%91&key2=%91value2%91" 

var requestBuf = new Buffer(requestBody); 

rest.post('your/url', { 
    data: requestBuf, 
    headers: { 
    'Content-Type': 'application/x-www-form-urlencoded; charset=windows-1252', 
    'Content-Length': requestBuf.length 
    } 
}).on('complete', function(data) { 
    console.log(data); 
}); 
+1

답변 해 주셔서 감사합니다. qs-iconv는 나를 위해 일했습니다. 내 요청 구현과 귀하의 인코딩 코드를 사용하고 서버가 예상대로 urlencoded 데이터를 수락했습니다. –

+0

좋아, 잘 듣고있어! – Tomalak

+0

동일한 문제가 있지만 멀티 파트/양식 데이터 (파일 포함)가있는 솔루션은 무엇입니까? – Sebastien