LoginSignup
4
3

More than 5 years have passed since last update.

euc-jpなサイトにnodeのrequestを使ってpostする時にハマって解決した事

Posted at

npmのrequestを使ってeuc-jpなサイトに
postするプログラムを以下のように作ろうとしていた。

CoffeeScriptです。

request = require('request')
Iconv = require('iconv').Iconv

callback = (error, response, body) ->
  if !error && response.statusCode == 200
    iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE')
    contents = iconv.convert(body).toString()
    console.log contents

form =
  name: 'テストユーザー'
  memo: 'メモなのです'


request.post( {
  url: 'http://hoge.jp',
  encoding: null,
  form: form
}, callback )

と、やっていたが、postする値をeuc-jpにするところで詰まってしまった。

しかも、requestの実装を見てみると、formの値を何だかutf-8に変換しているっぽい感じだった。

たぶん、この辺。

いろいろ試行錯誤した結果、以下のようにやれば上手く行った。

  1. formはハッシュじゃなくて、文字列にする。
  2. euc-jpの文字列をurlエンコードする

サンプルは以下のような感じになる。

coffee勉強中です(言い訳

request = require('request')
Iconv = require('iconv').Iconv
Encoding = require('encoding-japanese')


urlEncodeUtf8ToEuc = (string) ->
  iconv = new Iconv('UTF-8', 'EUC-JP//TRANSLIT//IGNORE')
  string = iconv.convert(string)
  encodeString = Encoding.urlEncode(string)

callback = (error, response, body) ->
  if !error && response.statusCode == 200
    iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE')
    contents = iconv.convert(body).toString()
    console.log contents

form = 'name=' + urlEncodeUtf8ToEuc('テストユーザー') + '&memo=' + urlEncodeUtf8ToEuc('メモなのです')

request.post( {
  url: 'http://hoge.jp',
  encoding: null,
  form: form
}, callback )

なんかもっと良さげな方法があったら誰か教えてください〜

参考

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3