problema utf8 en webservice php json y android

3,570 views
Skip to first unread message

Leodufer

unread,
Aug 31, 2011, 9:53:58 AM8/31/11
to desarrolladores-android
Hola a todos, estoy estudiando desarrollo de una aplicación android
con webservice json con php, al respecto primeramente tuve algunos
problemas con la función json_encode() pues este solo acepta
caracteres utf8 y retorna campo null las muchas palabras de español
(áéíóú ñ...etc). esto lo pude solucionar utilizando una funcion
modificada my_json_encode que esta como ejemplo en la guia de
referencia de php, solamente que a pesar de conseguir una cadena
limpia con todos los caracteres con tilde y ñ solo que al ejecutar
recuperar el servicio en android las letras problematicas son
mostradas como caracteres extraños....
por eso pregunto si alguien tendría algun ejemplo de como obtener esos
caracteres limpios en el android, he leido algo de utilizar
utf_ecode() al cagar el array para el json_encode() o algo sobre
htmlentities pero no encuentro como hacerlo...si alguien puede darne
una manoo....

con json_encode consigo esta cadena

{"users":[{"user":
{"user_id":"1","user_name":null,"user_picture":"","user_email":"leod...@hotmail.com","user_phone_number":"0983426892","user_birthday":"1983-01-23","user_alias":"leodufer","user_pass":"leo1203456","user_status":"0"}}]}
y esta es la funcion my_json_encode

function my_json_encode($in) {
$_escape = function ($str) {
return addcslashes($str, "\v\t\n\r\f\"\\/");
};
$out = "";
if (is_object($in)) {
$class_vars = get_object_vars(($in));
$arr = array();
foreach ($class_vars as $key => $val) {
$arr[$key] = "\"{$_escape($key)}\":\"{$val}\"";
}
$val = implode(',', $arr);
$out .= "{{$val}}";
}elseif (is_array($in)) {
$obj = false;
$arr = array();
foreach($in AS $key => $val) {
if(!is_numeric($key)) {
$obj = true;
}
$arr[$key] = my_json_encode($val);
}
if($obj) {
foreach($arr AS $key => $val) {
$arr[$key] = "\"{$_escape($key)}\":{$val}";
}
$val = implode(',', $arr);
$out .= "{{$val}}";
}else {
$val = implode(',', $arr);
$out .= "[{$val}]";
}
}elseif (is_bool($in)) {
$out .= $in ? 'true' : 'false';
}elseif (is_null($in)) {
$out .= 'null';
}elseif (is_string($in)) {
$out .= "\"{$_escape($in)}\"";
}else {
$out .= $in;
}
return "{$out}";
}

con lo cual se consigue esto

{"users":[{"user":{"user_id":"1","user_name":Oscar Leonardo Duarte
Fernández,"user_picture":"","user_email":"leod...@hotmail.com","user_phone_number":"0983426892","user_birthday":"1983-01-23","user_alias":"leodufer","user_pass":"leo1203456","user_status":"0"}}]}
pero en el adv aparece los caracteres extraños
https://lh6.googleusercontent.com/-5bXNSrWUHBg/Tl48rDh_fsI/AAAAAAAAByk/P8VenUXHXeI/s640/android.png

Daniela Garcia

unread,
Sep 1, 2011, 11:25:54 AM9/1/11
to desarrolladores-android
Hola,

Si tu problema es convirtiendo el archivo JSON para que reciba tu
cliente android, a mi me funciono utilizar la función utf8_encode en
mi servidor en PHP.

Como trabajaba con arreglos lo que hacia era convertirlos a UTF8 con
la siguiente función:

function convertArrayKeysToUtf8(array $array) {
$convertedArray = array();
foreach($array as $key => $value) {
if(!mb_check_encoding($value, 'UTF-8')) $value =
utf8_encode($value);
if(is_array($value)) $value = $this-
>convertArrayKeysToUtf8($value);

$convertedArray[$key] = $value;
}
return $convertedArray;
}

y luego si aplicaba el json_encode. Con eso resolvi mi problema con
los acentos, Ñ y otros caracteres especiales, que tal como te pasa a
ti solo aparecian en "null".

En este link puedes ver una explicación del tema:
http://www.desarrolloweb.com/articulos/producir-json-desde-php.html
...Hay un apartado especifico de: "Escapar caracteres especiales en
cadenas JSON"

Saludos,
Éxitos
Atte. Daniela

Leonardo Fernandez

unread,
Sep 1, 2011, 11:42:32 AM9/1/11
to desarrollad...@googlegroups.com
realmente gracias con esto lo solucione de un zas....
estaba usando asi: 

while($user = mysql_fetch_assoc($result)) {
$user['user_id'] = utf8_encode($user['user_id']);
$user['user_name'] = utf8_encode($user['user_name']);
$user['user_picture'] = utf8_encode($user['user_picture']);
$user['user_email'] = utf8_encode($user['user_email']);
$user['user_phone_number'] = utf8_encode($user['user_phone_number']);
$user['user_birthday'] = utf8_encode($user['user_birthday']);
$user['user_alias'] = utf8_encode($user['user_alias']);
$user['user_pass'] = utf8_encode($user['user_pass']);
$user['user_status'] = utf8_encode($user['user_status']);
}

Pero con lo que mostraste es mucho mejor.... 
Saludos 

juan josé salvatierra severiche

unread,
Sep 1, 2011, 11:59:49 AM9/1/11
to desarrollad...@googlegroups.com
hay otra forma usando la extención curl de php y padanso los datos por json_encode. más o menos así:
 
<?php
$ch = curl_init('http://tuapiaqui/user');
 
 $data = array(
  'firstName' => 'piter',
  'lastName' => 'ss',
  );
 
$qry_str = json_encode($qry_str);
 
 
curl_setopt($ch, CURLOPT_URL, 'http://tuURLaqui/user/'. $qry_str );  //talves en ves de json_encode tengas que formatear strlen($qry_str);   
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo $http_status;
$return = curl_exec($ch);
curl_close($ch);
//
// Print
echo $return;
echo 'Regreso codigo ' . $status['http_code'] . ' de la url ' . $status['url'];
?>
dependiendo del caso vas se pasan los parametros en un array y se codifica  ó tambien se puede formatear una cadena para la consulta.
 
si no me entendieron avisen  ;)

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.



--
saludos.
paladin.s...@gmail.com

juan josé salvatierra severiche

unread,
Sep 1, 2011, 8:26:37 PM9/1/11
to desarrollad...@googlegroups.com
<?php
$ch = curl_init('http://tuapiaqui/user');
 
 $qry_str = array(   //aqui no es data xD

  'firstName' => 'piter',
  'lastName' => 'ss',
  );
 
$qry_str = json_encode($qry_str);
 
 
curl_setopt($ch, CURLOPT_URL, 'http://tuURLaqui/user/'. $qry_str );  //talves en ves de json_encode tengas que formatear strlen($qry_str);   
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch); 
$status = curl_getinfo($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo $http_status;
$return = curl_exec($ch);
curl_close($ch); 
// 
// Print 
echo $return; 
echo 'Regreso codigo ' . $status['http_code'] . ' de la url ' . $status['url'];
?>

best regards
paladin.s...@gmail.com
Reply all
Reply to author
Forward
0 new messages