Java(jsoup)で某サイト(charset=euc-jp)へ自動POSTするプログラムを作っています。
formのtextやtextareaに対して半角文字列をPOSTした際には問題なく反映されますが、全角文字をPOSTすると文字化けになってしまいます。
(※より正確に言うと、文字化けというより、文字コードが無効と判別されたときに返ってくるコードのようです)
XAMPPで某サイトを簡易的に再現し、同じ現象が起きるようにしました。
PHP
1 2<?php header("Content-Type: text/html;charset=euc-jp");?> 3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 4<?php 5$title = $_POST["title"]; 6$comment = $_POST["comment"]; 7?> 8<html> 9<head> 10<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" /> 11</head> 12<body> 13<h1>コメント確認画面</h1> 14 15<?php 16echo <<<EOM 17<form method="post" action="posttxt2.php"> 18タイトル:<input type="text" name="title" value="{$title}"><br> 19コメント:<br> 20<textarea name="comment">{$comment}</textarea> 21</form> 22EOM; 23?> 24 25<a href="posttxt1h.html">posttxt1h.htmlへ戻る</a><br> 26</body> 27</html> 28
上記のPHPに対して、以下のJava(Jsoup)プログラムで自動POSTを行っています。
Java
1 public static void main(String[] args) throws IOException { 2 String ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"; 3 4 String title = "タイトル"; 5 String comment = "コメント"; 6 7 byte[] titleByteEuc = title.getBytes(Charset.forName("EUC_JP")); 8 9 String titleEuc = new String(titleByteEuc, "EUC_JP"); 10 11 //***** 確認画面へPOST実行 ***** 12 Response res3 = Jsoup.connect("http://localhost:81/work/posttxt2.php") 13 .userAgent(ua) 14 .timeout(0) 15 .header("Accept-Charset", "EUC_JP") 16 .data("title", titleEuc) 17 .data("comment", comment) 18 .followRedirects(false) 19 .method(Method.POST) 20 .execute(); 21 22 doc = res3.parse(); 23 System.out.println(doc); 24 }
この出力(doc)が以下のようになります。
html
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2<html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> 5 </head> 6 <body> 7 <h1>コメント確認画面</h1> 8 <form method="post" action="posttxt2.php"> 9 タイトル: 10 <input type="text" name="title" value="�帥����"> 11 <br> コメント: 12 <br> 13 <textarea name="comment">�潟��潟�</textarea> 14 </form> 15 <a href="posttxt1h.html">posttxt1h.htmlへ戻る</a> 16 <br> 17 </body> 18</html>
上記のtitleのvalut値"�…"は他の文字にしても同じようになるので、ただの文字化けというより、無効なコードと判別されているのではないかと考えています。
(例えばtitleを"あ"とするとvalue="��となり、"い"としてもまったく同じです)
上記のコードを書くにあたって、以下の情報を参考にしました。
【Java】byte配列から文字列へ変換、文字列からbyte配列へ変換する方法
php側は修正できない前提で、Java(Jsoup)側でどのようにPOSTすれば全角文字が正しく送信できるか、ご助言をいただければと思います。よろしくお願い致します。
※環境
・Windows10
・Eclipse(Java,jsoup)
・XAMPP(php)
※試行錯誤したこと
・最初は「.data("title", title)」とそのまま送信していました。(どちらも挙動は同じ)
・「.header("Accept-Charset", "EUC_JP")」はあってもなくても挙動に変化はありません。
・「.data("title", (String)titleByteEuc)」のように強引にキャストしようとしても、エラーになってしまいます。
・検証としてtitleのみ文字コードの変換を試みています。
・別途用意したhtmlのformからphpへPOSTした場合は、全角文字も文字化け無く表示されます。
・(追記)"EUC_JP"を"UTF-8"に変えて試してみましたが、挙動に変化はありませんでした。
よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/28 02:54