HTTP Post将€转换为?符号

tob*_*ias 6 php android http

我的Android应用程序通过HTTP Post与PHP服务器进行通信.我在以下参数中添加了HTTP请求:

   nameValuePairs.add(new BasicNameValuePair("text", message));
Run Code Online (Sandbox Code Playgroud)

message是一个String,包含符号€

在服务器上,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();
Run Code Online (Sandbox Code Playgroud)

在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();

?>
Run Code Online (Sandbox Code Playgroud)

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

Sev*_*yev 2

UrlEncodedFormEntity 的第二个构造参数是传输编码。用。。。来代替:

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

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

header("Content-Type: text/html;charset=UTF-8", true);
Run Code Online (Sandbox Code Playgroud)

在 PHP 中,或者

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
Run Code Online (Sandbox Code Playgroud)

HTML 下的<head>. 如果两者都提供的话,前者胜过后者。

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

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

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

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

然后,我在适当的情况下使用 deq($_POST["xxx"]),而不是 $_POST["xxx"]。由于服务器设置可能会更改(如果迁移,服务器本身也可能会更改),因此 dequote 函数必须考虑设置的当前值。