我在将utf-8从android传输到php时遇到了问题。我在线查找了很多解决方案,但是所有这些解决方案都无法发送UTF-8。
我的Java代码
String str = "";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
// set up post data
JSONObject json = getJSON();
JSONArray postjson=new JSONArray();
postjson.put(json);
// Post the data:
httppost.setHeader("json",json.toString());
httppost.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
httppost.getParams().setParameter("jsonpost",postjson);
httppost.getParams().setParameter("jsonpost",postjson);
HttpResponse response = httpclient.execute(httppost);
if(response != null)
{
str = getInputString(response);
return str;
}
}
catch (UnsupportedEncodingException e) {
return "";
}
catch (Exception e) {
return "";
}
return "";
另一方面我的php
<?php
header'Content-Type:text/plain; charset=utf-8');
$json = $_SERVER['HTTP_JSON'];
$data = json_decode($json);
$message = $data->message;
echo $message;
?>
我收到的输出只是一个空白字符串,如果它是一个中文字符,如“欢迎”,但如果它像'欢迎'。该消息将具有输出Welcome。这里的主要问题是什么?如果有人帮忙,我会感激不尽。 感谢。
解决方案:
$data = json_decode(file_get_contents('php://input'));
$message = $data->message;
echo $message;
?>
答案 0 :(得分:0)
为什么使用BiteArray
?你可以这样做:
httpPost.setEntity(new UrlEncodedFormEntity(values, HTTP.UTF_8)
其中值(List<NameValuePair>
)将成为参数。
答案 1 :(得分:0)
在你的ini上设置utf-8也可以在php脚本上使用这个功能:
ini_set('default_charset', 'utf-8');
将此代码放在:
<?php
ini_set('default_charset', 'utf-8');
$json = $_SERVER['HTTP_JSON'];
$data = json_decode($json);
$message = $data->message;
echo $message;
?>
答案 2 :(得分:0)
即使这个问题是2012年的问题,似乎问题仍未解决,同样的问题仍未得到解决。
由于我使用法语和Portuges语言在平板电脑和PHP Web服务器之间使用大量数据进行APP工作,所以使用&#34; stange char&#34;,我已经制作了一些测试:
当您使用Android平板电脑将数据发送到PHP网站时,您只需使用以下方式准备数据:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("op","_CID1"));
nameValuePairs.add(new BasicNameValuePair("la",la));
nameValuePairs.add(new BasicNameValuePair("lo",lo));
nameValuePairs.add(new BasicNameValuePair("id",codigo));
// Encoding URL for GET
String the_param = URLEncodedUtils.format(nameValuePairs,"utf-8");
String url = the_url + "?" + the_param;
在PHP方面,您必须使用isset测试值的存在(因此在这种情况下为isset($ _ GET [&#39; op&#39;]);依此类推,您必须执行验证使用SQL的数据,以防止SQL注入和解码de值。为此,只需使用:
$result = @mysqli_real_escape_string ($handle,$var);
其中hanlde是打开数据库后获得的句柄,$ var是从Android获得的值。 (例如使用SQLi)
简单的一个是在PHP端执行utf8_decode(我写的DECODE没有编码!!) 所以,如果你这样做,在PHP方面:
$str = "Não, l'été c'est pour bientôt";
echo $str;
您在Android下会收到错误的字符串。 要获得完美的价值,您必须:
$str = "Não, l'été c'est pour bientôt";
$str = utf8_decode($str);
echo $str;
要在Android上获取字符串,请执行以下操作:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url[0]);
HttpResponse resp = httpclient.execute(httppost);
HttpEntity ent = resp.getEntity();
text = EntityUtils.toString(ent);
说明:基本上,在PHP端,字符串是UTF8。当您执行utf8-decode时,您将字符串设置为ISO-8859-1(Android上的defaut值)(请参阅EntityUtils doc)。
如果你不在PHP端执行utf8_decode,你将使用utf8传输数据,这在Android上是defaut所不知道的。在这种情况下,您将必须使用参数utf8执行EntityUtils。
事实上,或者您在PHP端将UTF8转换为ISO-8859-1然后传输并使用ISO-8859-1(选项1)或者您传输UTF8等,需要使用EntityUtils在Android端进行转换(选项) 2)。
希望这会有所帮助 彼得