【问题标题】:HTTP Post converts € to ? symbolHTTP Post 将 € 转换为 ?象征
【发布时间】:2012-01-04 01:13:38
【问题描述】:

我的 Android 应用通过 HTTP Post 与 PHP 服务器通信。 我在 HTTP 请求中添加以下参数:

   nameValuePairs.add(new BasicNameValuePair("text", message));

message 是一个字符串,包含符号 €

在服务器上 PHP 正在运行并获取请求。 不幸的是,€符号自动转换为?象征。 所有其他符号都像“ä, ü, $, ß

在 Android 上我没有设置编码:

  HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://server.com/test.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

在 PHP 站点上,我也没有指定任何内容。 代码如下:

<?php

mysql_connect("blablaost.com", "blabla", "blabla") or die(mysql_error());
mysql_select_db("asfd") or die(mysql_error());
$mysqldate = gmdate( 'Y-m-d H:i:s');

$language = (int) $_REQUEST['language'];

mysql_query("blabla ... .$_REQUEST['text']. ") 
or die(mysql_error());  

mysql_close();

?>

$_REQUEST['text'] 包含€,它给了我一个?

【问题讨论】:

  • 你能检查一下双方正在发送/期望的编码吗?
  • 在 php 端使用 urldecode() 和 rawurldecode() 有什么运气吗?你如何检查结果?
  • 看来PHP服务器的输出/输入编码是ISO-8859-1。我通过在 mySQL DB 中编写它来检查它。但这不是错!我不确定应该如何处理 urldecode()..
  • urldecode() 和 rawurldecode() 不是正确的方法。我通过 HTTP post 发送值。它不附加在 URL 中
  • 在发布 url 编码数据时需要进行 URL 编码,因为您声明要对数据进行 url 编码。

标签: php android http


【解决方案1】:

UrlEncodedFormEntity 的第二个构造参数是传输编码。替换为:

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));

此外,请确保显示该值的网页向浏览器报告一个字符集并符合该字符集。要将字符集报告给浏览器,请使用

header("Content-Type: text/html;charset=UTF-8", true);

在 PHP 中,或

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

HTML 的&lt;head&gt; 下的元素。如果两者都提供,前者胜过后者。

PHP 文件具有的实际编码(即其中的非 ASCII 字符的编码)必须与作为其 Content-Type 的一个 PHP 文件声明相匹配。根据您的 PHP 编辑器,可能有不同的方法来设置文件的编码。例如,在 Visual Studio 中,有一个“使用编码保存”命令。

编辑回复:不相关的问题:

要删除 PHP 魔术引号,我使用以下函数:

function deq($s) //Stands for "dequote"
{
    if($s == null)
        return null;
    return
        get_magic_quotes_gpc() ?
        stripslashes($s) : $s;
}

然后,我在适当的地方使用 deq($_POST["xxx"]) 代替 $_POST["xxx"]。由于服务器设置可能会更改(如果您迁移,服务器本身可能会更改),dequote 函数必须考虑设置的当前值。

【讨论】:

  • 好的,现在我得到了€符号,比如 -â .. 我想我也必须在 php 文件中设置编码?
  • PHP 文件的编码(即其中的非 ASCII 字符的编码)必须与声明为 Content-Type 的 PHP 文件相匹配。根据您的 PHP 编辑器,可能会有不同的方法;例如,在 Visual Studio 中,有一个“使用编码保存”命令。
  • 我已将 php 文件的编码设置为 utf-8 lf,但此行仍然存在问题: if(md5(utf8_encode($_REQUEST['text']."test")) == $_REQUEST['hash']) 如果文本包含€,我的评估结果为 false
  • 我已删除 utf8_encode(),现在它适用于符号 \ " 和 ' 旁边的所有字符
  • 引号问题可能是由 PHP 的“魔术引号”功能引起的。见here
猜你喜欢
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2021-05-24
  • 2013-06-10
相关资源
最近更新 更多