質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

jsoupでphp(euc-jpのform)に全角文字をpostすると文字化け(無効なコード?)になってしまう

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,707

risaito74

score 44

Java(jsoup)で某サイト(charset=euc-jp)へ自動POSTするプログラムを作っています。
formのtextやtextareaに対して半角文字列をPOSTした際には問題なく反映されますが、全角文字をPOSTすると文字化けになってしまいます。
(※より正確に言うと、文字化けというより、文字コードが無効と判別されたときに返ってくるコードのようです)
XAMPPで某サイトを簡易的に再現し、同じ現象が起きるようにしました。

<?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を行っています。

    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)が以下のようになります。

<!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で文字列の文字コードを変換する

【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"に変えて試してみましたが、挙動に変化はありませんでした。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

posttxt2.phpがUTF8なのでは。
euc-jpはhtmlだけ。
UTF8で投稿は試してみましたか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/28 11:54

    回答ありがとうございます。
    posttxt2.php自体は秀丸で「日本語(EUC)」にエンコードして保存しています。
    また"EUC_JP"を"UTF-8"に変えて試してみましたが、結果に変化はありませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る