2014-12-19 68 views
3

我需要從Android發送一個字符串到一個PHP Web服務(用戶輸入在EditText中)。 這個運行正常,有標準字符和一些特殊字符(比如重音,ñ和更多),但是當我發送西里爾文或阿拉伯文字符時,Web服務不能識別,然後替換爲其他字符(如±ÐÒ) 。 這是我的Android代碼:安卓到php發送UTF8編碼文本,不工作與西里爾或阿拉伯文字符

// Post the data: 
public class Sincronizar extends AsyncTask<JSONObject, JSONObject, JSONObject> { 
    String resFromServer=null; 
    private String url = "http://.../send.php"; //The url of the web service 
    @Override 
    protected JSONObject doInBackground(JSONObject... data) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     JSONObject jsonResponse = null; 
     try { 
      JSONObject jsonPlace = new JSONObject(); 
      jsonPlace.put("pais", ((EditText)findViewById(R.id.etTexto)).getText().toString()); 
      JSONArray postjson=new JSONArray(); 
      postjson.put(jsonPlace); 

      // Post the data: 
      httppost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); 
      httppost.setHeader("json",jsonPlace.toString()); 
      httppost.getParams().setParameter("jsonpost",postjson); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 
      if (response.getEntity()!=null) { 
       resFromServer = org.apache.http.util.EntityUtils.toString(response.getEntity()); 
       jsonResponse=new JSONObject(resFromServer); 
      } 
     } catch (Exception e) { 
      Log.e("Sincronizar","doIn:"+resFromServer); 
     } 
     return jsonResponse; 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonResponse) { 
     try{ 
      if (jsonResponse!=null) { 
       String pais = jsonResponse.getString("pais"); 
       String respuesta = String.format("PAIS: %s",pais); 
       Log.e("Sincronizar",""+respuesta); 
       ((TextView)findViewById(R.id.textView1)).setText(respuesta); 
      } 
     }catch (Exception e) { 
      Log.e("Sincronizar","onPostExecute: "+e.getMessage()); 
     } 
     super.onPostExecute(jsonResponse); 
    } 
} 

這是PHP Web服務:

<?php 
header('Content-Type: text/html; charset=utf-8'); 
try { 
    if (isset($_SERVER['HTTP_JSON'])) { 
    $json = $_SERVER['HTTP_JSON']; 
    $cadena = utf8_encode($json); 
    $data = json_decode($cadena,true); 
    $json_error= json_last_error(); 
    $pais = $data["pais"]; 
} else { 
    $pais="No received"; 
} 
}catch(Exception $e) { 
    $pais="Exception: ".$e->getMessage(); 
} 
$output=array('pais'=>$pais); 
print(utf8_encode(json_encode($output))); 
?> 

在Web服務中我也嘗試插入接收到MySQL數據庫字符串。正常的和一些特殊的字符如Ñ,á(重音符)等等,都會被插入。但用阿拉伯文或西里爾字符我收到這樣的字符串:「±±'」,「±Ã'À」

我認爲問題是編碼,但我發送和接收UTF8(我認爲) 任何理念? 謝謝!

+0

數據庫中的排序規則是什麼? – idstam 2014-12-19 07:47:40

回答

0

試試這個功能這可能會幫助你

function parseUtf8ToIso88591($string){ 
    if(!is_null($string)){ 
      $iso88591_1 = utf8_decode($string); 
      $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string); 
      $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8'); 
      return ""; 
    } 
    return $string; 
} 
1

的Sql opeatrion之前對服務器運行PHP(相當於或者,我用的mysqli)

$mysqli->set_charset("utf8") 

這解決了我的問題

mysqli_set_charset($con,'utf8'); 
mysqli_query($con, "insert into table (name, lastname) values ('Ñishá', 'Akopov')"); 

您可以編寫select語句並檢索utf8中的行

希望這會有所幫助