Windowsコマンドラインからcurlで全角文字を送るには


#1

Windows7 (日本語) のコマンドプロンプトから
curl (curl-7.33.0-win64-nossl) で
elasticsearch にインデックスのフィールドの値を入力するとき
値が英数字の時は正しく入力できるのですが
値が全角文字の時は以下のようなエラーになってしまいます。
値が全角文字の時はどのように記述すればよろしいのでしょうか。

curl -X PUT http://localhost:9200/hoge_index/hoge_type/1?pretty=1 -d "{"name":"yamada"}"
{
"_index" : "hoge_index",
"_type" : "hoge_type",
"_id" : "1",
"_version" : 2,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}

curl -X PUT http://localhost:9200/hoge_index/hoge_type/1?pretty=1 -d "{"name":"山田"}"
{
"error" : {
"root_cause" : [ {
"type" : "mapper_parsing_exception",
"reason" : "failed to parse [name]"
} ],
"type" : "mapper_parsing_exception",
"reason" : "failed to parse [name]",
"caused_by" : {
"type" : "json_parse_exception",
"reason" : "Invalid UTF-8 start byte 0x8e\n
at [Source: org.elasticsearch.common.io.stream.
InputStreamStreamInput@32158d; line: 1, column: 11]"
}
},
"status" : 400
}


に書かれているように、chcp 65001を実行して
プロパティのオプションタブで現在のコードページが
65001(UTF-8)と表示されていることを確認した後に、
3つのフォントのどれを選んでも、
全角文字を入力することができませんでしたので、
(全角文字を入力する方法が分かりませんでしたので)
curl -X PUT http://localhost:9200/hoge_index/hoge_type/1?pretty=1 -d "{"name":"山田"}"
をコピーしてペーストして実行しましたが(@32158dの部分以外は)同じエラーになります。

よろしくお願いします。


(kazuhira) #2

chrp 65001の設定で、UTF-8に対応するのは表示のみで、入力はできないように見受けられます。


手元の環境で同じコマンドを実行してみましたが、
curl -X PUT http://localhost:9200/hoge_index/hoge_type/1?pretty=1 -d "{\"name\":\"山田\"}"
確かに同様のエラーになりました(直接入力は不可でしたので、コピー&ペーストです)

ただエラーの内容としても、
Invalid UTF-8 start byte 0x8e
となっていますので、Shift_JISコードで送信されているようです。

送信する内容を1度UTF-8でテキストファイルに保存して、-d @[ファイル名]としてファイルの中身を送信される方がよいのではないでしょうか?


#3

ありがとうございます。
コマンドラインから直接送るのは難しいということですね。
教えていただきましたように、
curl -X PUT http://localhost:9200/hoge_index/hoge_type/1?pretty=1 -d @a.json
---a.json(UTF-8)-----
{
"name":"山田"
}

とファイルにして実行しましたところ、
Elasticsearch-head プラグインでは正しく表示されているので、
正しく送られたのですが、
curl -X GET http://localhost:9200/hoge_index/hoge_type/1?pretty=1
で取得してみると、全角の部分が文字化けしています。

chrp 65001の設定では、入力はできないが、
UTF-8に対応する表示は可能のように読み取れましたので、
コマンドプロンプトのプロパティのフォントをMSゴシックにして
chcp 65001を実行後、
プロパティのフォントには
(1)Consolas
(2)Lucida Console
(3)ラスターフォント
の3種類になっているので、順番に変えて
curl -X GET http://localhost:9200/hoge_index/hoge_type/1?pretty=1
を実行してみたのですが、
いずれも全角の部分が正しく表示されませんでした。

curl -X GETで全角文字を正しく表示することはできますでしょうか。

よろしくお願いします。


(kazuhira) #4

curl -X GETで全角文字を正しく表示することはできますでしょうか。

可能です。

エンコード変更前にあらかじめMSゴシックに設定しておき、
chcp 65001
としてコマンドプロンプト表示をUTF-8にした後、そのままcurlを実行すればマルチバイト文字も表示されるはずです。

chcp 65001
を実行した後に、フォントを変更しないようにしてください。chcp 65001後はMSゴシックが表示されていないはずですが、プロパティを変更しなければ大丈夫だと思います。


#5

ありがとうございます。
教えていただきました通りにしましたら、
正しく表示されるようにました。

chcp 65001
を実行した後に、フォントを変更しないようにしてください

の助言が、私にはとても役に立ちました。

chcp 65001実行直後に、
フォントサイズが未設定になり、警告表示されるので、
気持ちが悪いので、必ずサイズを設定していたので、
もし、この助言がなかったら解決が長引いていたと思います。
とても親切な助言ありがとうございました。

あと1つだけ気になることがあるのですが、
レスポンスの最後に、
curl: (23) Failed writing body (145 != 149)
と表示されているのですが、
これは何の問題が起きていると言っているのでしょうか。


{
"_index" : "hoge_index",
"_type" : "hoge_type",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "山田"
}
}
curl: (23) Failed writing body (145 != 149)

http://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body
に同じような質問がありましたが、ここの回答の意味が私にはよく分かりませんでした。

よろしくお願いします。


(kazuhira) #6

curlで-iオプションを付けると、Content-Lengthが表示されますが、ここで返却される値とcurlが認識している値が合わない状況になっているようです。

curl -i -XGET http://localhost:9200/hoge_index/hoge_type/1?pretty=1
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 149

なお、エンコードをShift_JISのまま(UTF-8に変更しない)場合はこのエラーは発生しないため、UTF-8環境に変更したことにcurlが影響を受けていると思います。


#7

返却される値とcurlが認識している値が合わないといっていたのですね。
全角1個のLengthの値の扱いの違い(1と3)で起きているように見えます。
いろいろ調べていただきましてありがとうございました。


(system) #8