首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非拉丁数据从Java发布到PHP

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

Stack Overflow用户
提问于 2014-10-31 12:50:52
回答 2查看 53关注 0票数 0

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

代码语言:javascript
复制
    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文件如下所示:

代码语言:javascript
复制
<?php
    $posttitle = $_POST["title"];
    echo "$posttitle";
    echo urldecode($posttitle);
?>

echo显示的是一些粗俗的مليون,而不是实际的标题العربية

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

加法信息:

  • 数据库是utf8_general_ci,确实支持阿拉伯语(当我使用phpMyAdmin手动更新帖子时,它是有效的)。
  • 我在InputStreamReaderInputStreamWriter中添加了InputStreamReaderInputStreamWriter,我的行为如下:
代码语言:javascript
复制
- Tomcat6 on windows, (PHP + mysql) on CentOS --> OK
- Tomcat6 on CentOS , (PHP + mysql) on CentOS --> Not OK

加性信息2

  • 使用javascript发布很好:页面用正确的编码进行响应。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-31 13:31:50

您的代码有很多地方可能出错,我们无法测试它。此外,我建议使用功能齐全的HTTP客户端而不是URLConnection。您应该检查的内容列表:

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-31 13:01:35

尝试使用CharsetEncoder显示可能的编码异常。

代码语言:javascript
复制
CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
encoder.onMalformedInput(CodingErrorAction.REPORT);
encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26675140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档