从安卓手机发送阿拉伯文到在线MySQL数据库

3

我制作了一个应用程序,可以将Android设备上的几个文本输入发送到我的在线数据库。我的应用程序运行良好,但一些用户报告说他们无法使用阿拉伯文本。所以我尝试了一下,当我将阿拉伯文本发送到数据库中时,它会显示为????? ????? ??????

我的PHP脚本:

<?php
$connect = mysql_connect($db_host,$db_uid,$db_pass) or die('could not connect');
mysql_select_db($db_name);

if(mysql_errno($connect))
{
die("Failed to connect to MySQL: " . mysql_error());
}
else
{
    echo "success";
mysql_query("SET NAMES 'utf8'"); mysql_query('SET CHARACTER SET utf8');
}

$name = isset($_POST['name']) ? $_POST['name'] : '';
$sex = isset($_POST['sex']) ? $_POST['sex'] : '';
$nationality = isset($_POST['nationality']) ? $_POST['nationality'] : '';

$query = mysql_query( "insert into people (name, sex, nationality) values (N'$name' ,N'$sex', N'$nationality') ", $connect);

print_r($_POST);
if(!$query) echo mysql_error();
mysql_close($connect);
?>

我的Android代码:

                DefaultHttpClient httpclient= new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://www.xxxxxxxx.com/thescript.php");
                Log.e("done 1st","its here");

                try
                {
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("name", Name.getText().toString()));
                    nameValuePairs.add(new BasicNameValuePair("sex",  Sex.getText().toString()));
                    nameValuePairs.add(new BasicNameValuePair("nationality",  Nationality.getText().toString()));

                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    Log.e("done", String.valueOf(response));
                }

我尝试了一些方法,但都没有用。

当使用在线PC .php 进行插入操作时,结果是这样的:لببي

---------

我的数据库设置如下:

表排序规则utf8_general_ci,类型为MyISAM

它里面的列 (名字、性别、国籍) 如下:

类型varchar排序规则utf8_general_ci

例如: 输出应该是علي,但实际上是???


尝试从您的浏览器中插入并再次查看,如果检查通过,则检查您的Android应用程序。 - Jason OOO
你应该比我更清楚这个,我只是推荐了一些容易的东西。 - Jason OOO
我尝试使用浏览器,结果得到了这样的内容:لببي - John Jared
6个回答

2

按照以下方式操作

DefaultHttpClient httpclient= new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://www.xxxxxxxx.com/thescript.php");
                Log.e("done 1st","its here");

                try
                {
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("name", Name.getText().toString()));
                    nameValuePairs.add(new BasicNameValuePair("sex",  Sex.getText().toString()));
                    nameValuePairs.add(new BasicNameValuePair("nationality",  Nationality.getText().toString()));

                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); //UPDATE HERE
                    HttpResponse response = httpclient.execute(httppost);
                    Log.e("done", String.valueOf(response));
                }

它正在运行。伙计,你把我的项目带回来了,我已经放弃了,然后你又把它带回来了!!!谢谢你!!! - John Jared

1

类型不应该是varchar,因为它不接受Unicode字符。将其更新为nvarchar!

像Andries所说,排序规则也应设置为utf8_general_ci或其他Unicode排序规则。

编辑:

因此,由于您使用的是MySQL v5.x,因此应该有一个配置文件(例如my.cnf)。您应确保不使用超级用户访问数据库。将此添加到您的配置文件中。

[mysqld]
init_connect='SET collation_connection = utf8_general_ci; SET NAMES utf8;'
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

这将触发任何连接使用utf8_general_ci进行连接。
重新启动MySQL,如果mysqld.log没有返回任何错误,那么你应该成功了!

那我创建一个名为“my.cnf”的文件并将代码放在里面?然后呢?我把文件放在哪里? - John Jared
你不必创建那个文件,你应该已经有它在MySQL安装目录中了。只需将代码追加进去即可。 - Vereos
我不需要,因为我使用 Web 托管。 - John Jared
没有etc/mysql/文件夹吗? - Vereos
我想我已经没有更多的想法了:( 很抱歉! - Vereos
显示剩余2条评论

1
我相信你的java代码是正确的。
在后端,尝试使用以下代码:(如果可以切换到PDO)
$conn= mysql_connect($db_host,$db_uid,$db_pass, true) or die('could not connect');
mysql_select_db($db_name);
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);
mysql_set_charset('utf8', $conn); 

使用调试程序来了解编码方式:

<?php
$charset = mysql_client_encoding($conn);
echo "The current character set is: $charset\n";
?>

然后

以root身份执行以下命令:

ALTER DATABASE YOUR_DATABASE_ NAME CHARACTER SET utf8 COLLATE utf8_general_ci;
update mysql.proc set character_set_client = "utf8", collation_connection = "utf8_general_ci", db_collation = "utf8";

然后执行下面的SO答案中的代码


我现在得到的是:当前字符集为:utf8 successArray(),但阿拉伯文本仍然是???????? - John Jared
请尝试答案中的 "Then" - Sherif elKhatib
我可以使用phpmyadmin中的sql选项卡来执行它吗?因为我正在使用000webhost。 - John Jared
如果我执行,会得到以下错误信息:**#1142 - 用户'axxxxx'@'localhost'没有对表'proc'的UPDATE命令权限。** - John Jared
哦,你在使用共享的烂主机。听我说,可以请你在 PHP 文件中加入 die($name); 语句,并检查在 Android 设备上接收到的内容吗? - Sherif elKhatib
显示剩余4条评论

0

我遇到了这个问题已经有一个星期的时间,一直在搜索解决方法,@biraj提出的解决方案是唯一的解决方法!不需要更改数据库或在php中设置UTF-8等...

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

这个问题将永远消失。


0

你应该将表格的排序规则更改为utf8_general_ci或任何其他Unicode排序规则。Latin1无法表示阿拉伯文。


-1

你需要将正确的(UTF-8)字符集传递给你的UrlEncodedFormEntity构造函数。


你能教我怎么做吗? - John Jared
@JohnJared 嗯?类似于 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, Charset.forName("UTF-8"))); 这样的代码 - 你可能需要使用 try..catch 块来处理潜在的异常。 - Jan Schejbal
我从.setentity中得到了**类型HttpEntityEnclosingRequestBase中的方法setEntity(HttpEntity)不适用于参数(UrlEncodedFormEntity, Charset)**的错误信息。 - John Jared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接