将非拉丁语数据从Java发布到PHP

时间:2014-10-31 12:50:52

标签: java php post character-encoding

我将一些数据从Java发布到PHP:

    try {
        URL obj = new URL("http://myphpurl/insert.php");
        HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod(POST_METHOD);
        conn.setDoInput(true);
        conn.setDoOutput(true);

        Map<String, String> params = new HashMap<String, String>();
        params.put("title", "العربية");

        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = 
            new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
        writer.write(getQuery(params));
        writer.flush();
        writer.close();
        os.close();

        BufferedReader in = 
            new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        LOG.debug("response {}", response);

        in.close();
        response = null;
        inputLine = null;
        conn.disconnect();
        conn = null;
        obj = null;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


    private String getQuery(Map<String, String> params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();
        boolean first = true;

        Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
        while (it.hasNext()) {
            if (first)
                first = false;
            else
                result.append("&");

            Map.Entry<String, String> pairs = it.next();

            result.append(URLEncoder.encode(pairs.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(pairs.getValue(), "UTF-8"));

            it.remove(); // avoids a ConcurrentModificationException
        }

    return result.toString();
}

insert.php文件如下所示:

<?php
    $posttitle = $_POST["title"];
    echo "$posttitle";
    echo urldecode($posttitle);
?>

回声显示一些gibbrish مليون而不是实际标题العربية

然后将这个gibbrish插入到mysql数据库中。

附加信息:

  • DATABASE是utf8_general_ci并且确实支持阿拉伯语(当我使用phpMyAdmin手动更新帖子时)。

  • 我在UTF-8InputStreamReader中添加了InputStreamWriter,我有以下行为:

    • Tomcat6在Windows上,(PHP + mysql)在CentOS上 - &gt;行
    • CentOS上的Tomcat6,CentOS上的(PHP + mysql) - &gt;不行。

Additionnal infos 2

  • 使用javascript发布工作正常:页面以正确的编码进行响应。

2 个答案:

答案 0 :(得分:1)

您的代码可能会出现许多问题,我们无法对其进行测试。另外,我建议使用功能齐全的HTTP客户端而不是URLConnection。您应该检查的列表:

  • 将正确的源文件编码传递给javac(您的测试是硬编码的。您是运行相同的二进制文件还是从IDE运行程序,或者无论如何在部署机器上重新编译?)
  • 使用UTF-8编码查询字符串
  • 如果您的API使用HTTP请求正文,请检查两端是否同意编码,和/或使用Content-Type MIME标头
  • PHP有二进制字符串(必须给出编码),因此请确保在连接到数据库时使用适当的参数,和/或相应地进行转码
  • 从PHP服务器发送文本时,请注意模板和动态位的编码!

活动部件的数量非常多。您不应该通过print / echo进行调试,因为这会增加另一级转码。如果可能,转储原始文本字节并使用十六进制编辑器。

有趣的是,Windows→Linux是可以的,而Linux→Linux则不行。您可能想要检查两台CentOS计算机上的区域设置(可能在目标进程内运行操作系统命令 - JVM和Apache)

答案 1 :(得分:0)

尝试使用CharsetEncoder来揭示可能的编码例外情况。

CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
encoder.onMalformedInput(CodingErrorAction.REPORT);
encoder.onUnmappableCharacter(CodingErrorAction.REPORT);