我的Android应用程序通过HTTP Post与PHP服务器进行通信。我向 HTTP 请求添加以下参数:
nameValuePairs.add(new BasicNameValuePair("text", message));
消息是一个字符串,包含符号 €
在服务器上,PHP 正在运行并获取请求。不幸的是,€ 符号会自动转换为 ?象征。所有其他符号的工作方式类似于"ä, ü, $, ß
在安卓上,我没有设置编码:
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'] 包含 € 它给了我一个 ?
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 的<head>
下。如果两者都提供,前者胜过后者。
的实际编码(即其中非 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;
}
然后,我在适当的时候使用 deq($_POST["xxx"](,而不是 $_POST["xxx"](。由于服务器设置可能会更改(并且服务器本身可能会在迁移时更改(,因此 dequote 函数必须考虑设置的当前值。