質問編集履歴

1 "EUC_JP"を"UTF-8"に変えて試した情報を追記

risaito74

risaito74 score 44

2017/01/28 11:56  投稿

jsoupでphp(euc-jpのform)に全角文字をpostすると文字化け(無効なコード?)になってしまう
Java(jsoup)で某サイト(charset=euc-jp)へ自動POSTするプログラムを作っています。
formのtextやtextareaに対して半角文字列をPOSTした際には問題なく反映されますが、全角文字をPOSTすると文字化けになってしまいます。
(※より正確に言うと、文字化けというより、文字コードが無効と判別されたときに返ってくるコードのようです)
XAMPPで某サイトを簡易的に再現し、同じ現象が起きるようにしました。
```PHP
<?php header("Content-Type: text/html;charset=euc-jp");?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<?php
$title = $_POST["title"];
$comment = $_POST["comment"];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
</head>
<body>
<h1>コメント確認画面</h1>
<?php
echo <<<EOM
<form method="post" action="posttxt2.php">
タイトル:<input type="text" name="title" value="{$title}"><br>
コメント:<br>
<textarea name="comment">{$comment}</textarea>
</form>
EOM;
?>
<a href="posttxt1h.html">posttxt1h.htmlへ戻る</a><br>
</body>
</html>
```
上記のPHPに対して、以下のJava(Jsoup)プログラムで自動POSTを行っています。
```Java
   public static void main(String[] args) throws IOException {
       String ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36";
       String title = "タイトル";
       String comment = "コメント";
       byte[] titleByteEuc = title.getBytes(Charset.forName("EUC_JP"));
       String titleEuc = new String(titleByteEuc, "EUC_JP");
       //***** 確認画面へPOST実行 *****
       Response res3 = Jsoup.connect("http://localhost:81/work/posttxt2.php")
               .userAgent(ua)
               .timeout(0)
               .header("Accept-Charset", "EUC_JP")
               .data("title", titleEuc)
               .data("comment", comment)
               .followRedirects(false)
               .method(Method.POST)
               .execute();
       doc = res3.parse();
       System.out.println(doc);
   }
```
この出力(doc)が以下のようになります。
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>
 <h1>コメント確認画面</h1>
 <form method="post" action="posttxt2.php">
   タイトル:
  <input type="text" name="title" value="&#xfffd;帥&#xfffd;&#xfffd;&#xfffd;&#xfffd;">
  <br> コメント:
  <br>
  <textarea name="comment">&#xfffd;潟&#xfffd;&#xfffd;潟&#xfffd;</textarea>
 </form>
 <a href="posttxt1h.html">posttxt1h.htmlへ戻る</a>
 <br> 
</body>
</html>
```
上記のtitleのvalut値"&#xfffd;…"は他の文字にしても同じようになるので、ただの文字化けというより、無効なコードと判別されているのではないかと考えています。
(例えばtitleを"あ"とするとvalue="&#xfffd;&#xfffd;となり、"い"としてもまったく同じです)
上記のコードを書くにあたって、以下の情報を参考にしました。
[Javaで文字列の文字コードを変換する](http://d.hatena.ne.jp/kanonji/20120502/1335964300)
[【Java】byte配列から文字列へ変換、文字列からbyte配列へ変換する方法](http://javatechnology.net/java/byte-string/)
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"に変えて試してみましたが、挙動に変化はありませんでした。  
よろしくお願い致します。
  • Java

    21911 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • PHP

    33285 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る