我将一些数据从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-8
和InputStreamReader
中添加了InputStreamWriter
,我有以下行为:
Additionnal infos 2
答案 0 :(得分:1)
您的代码可能会出现许多问题,我们无法对其进行测试。另外,我建议使用功能齐全的HTTP客户端而不是URLConnection
。您应该检查的列表:
javac
(您的测试是硬编码的。您是运行相同的二进制文件还是从IDE运行程序,或者无论如何在部署机器上重新编译?)活动部件的数量非常多。您不应该通过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);