0

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

3 回答 3

0

即使这个问题的日期是 2012 年,似乎问题还没有解决,同样的问题也没有解决。

由于我正在开发 APP,使用平板电脑和 PHP Web 服务器之间的大量数据传输,使用法语和葡萄牙语语言,所以使用“stange char”,我做了一些测试:

  • 当您使用 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['op']); 等等,然后,您必须使用 SQL 执行数据验证,以便防止 SQL 注入和解码 de 值。为此,只需使用:

$result = @mysqli_real_escape_string ($handle,$var);

其中 hanlde 是您打开数据库后获得的句柄,而 $var 是您从 Android 获得的值。(示例是使用 SQLi)

  • 当您从 PHP 获取数据时,意味着您的 PHP 网站“回显”数据,平板电脑获取它们。两种选择:

简单的一个是在 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 上的默认值(请参阅 EntityUtils 文档)。

如果您不在 PHP 端进行 utf8_decode,您将使用 utf8 传输数据,这在 Android 上是默认未知的。在这种情况下,您必须使用参数 utf8 执行 EntityUtils。

实际上,或者您在 PHP 端将 UTF8 转换为 ISO-8859-1,然后传输并使用 ISO-8859-1(选项 1),或者您传输 UTF8 等,需要在 Android 端使用 EntityUtils(选项 2)进行转换。

希望这会帮助彼得

于 2014-09-03T12:53:25.703 回答
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;
?>
于 2012-09-01T13:08:04.547 回答
0

你为什么用一个BiteArray?你可以简单地这样做:

httpPost.setEntity(new UrlEncodedFormEntity(values, HTTP.UTF_8)

其中 values ( List<NameValuePair>) 将是参数。

于 2012-09-01T12:04:24.240 回答