android和php json utf-8失败

时间:2012-09-01 11:47:44

标签: php android json

我在将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;
?>

3 个答案:

答案 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获取数据时,意味着您的PHP网站&#34; echo&#34;数据和平板电脑得到它们。两个选项:

简单的一个是在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)。

希望这会有所帮助 彼得