Spanish Problemas al leer Base de Datos con algunos carateres

desof

Well-Known Member
Licensed User
Longtime User
Hola amigos tengo una aplicacion que lee datos de mi servidor desde una BD Mysql y funciona ok ecepto cuando se encuentra con una palabra con acento o ñ o por ejemplo esto Nº 40,

Que puede ser adjunto la pantallas.
 

Attachments

  • CAPTURA.jpg
    CAPTURA.jpg
    48.5 KB · Views: 439
  • 13-04-2013 17-26-34.jpg
    13-04-2013 17-26-34.jpg
    33.6 KB · Views: 521

pilbazan

Member
Licensed User
Longtime User
Hola, creo que tendrás que dar más datos, o pegar parte del código, pues alguna vez he realizado alguna app que leía de una bbdd sqlite y leía bien las palabras con acentos.

Lo mejor siempre es acotar el problema:

a) Pasa si en la frase hay un numero? (no pongas otros caracteres extraños)
b) Pasa si en la frase hay alguna tilde? (no pongas otros caracteres extraños)
c) No pasa con letras comunes?
d) Pasa con la ñ?
etc...

Que pasaría si en lugar de mostrar desde una BBDD muestras desde un string puesto hardcoded (hardcoded=puesto a mano dentro del script)?

Saludos
 

desof

Well-Known Member
Licensed User
Longtime User
Hola, creo que tendrás que dar más datos, o pegar parte del código, pues alguna vez he realizado alguna app que leía de una bbdd sqlite y leía bien las palabras con acentos.

Lo mejor siempre es acotar el problema:

a) Pasa si en la frase hay un numero? (no pongas otros caracteres extraños)
b) Pasa si en la frase hay alguna tilde? (no pongas otros caracteres extraños)
c) No pasa con letras comunes?
d) Pasa con la ñ?
etc...

Que pasaría si en lugar de mostrar desde una BBDD muestras desde un string puesto hardcoded (hardcoded=puesto a mano dentro del script)?


Saludos

Disuclpa que no me explique bien!!

Si te fijas en la captura de la BD de MySql hice una busqueda por el campo Numero de telefono y me arrojo el registro que lo contiene, y en el campo Nombre tiene el sig valor Escuela Jardín Nº 40 'Angela Peralta Pino' o se alli en la web de mi servidor funciona ok! y verifico que los datos estan correctos.

Ahora si miras la otra captura del emulador hice la misma busqueda por el campo numero y me devuelve el mismo registro pero en el campo Nombre me lo coloca como Null fijate que el telefono en esa captura es 422850 y es un numero unico.!!

Acabo de hacer las pruebas y pasa cuando hay tilde cuando hay ñ y cuando esta el caracter º (ejemplo Nº 90)
No pasa cuando hay numeros combinados con letras!!!
 
Last edited:

pilbazan

Member
Licensed User
Longtime User
He mirado el foro en inglés, y pareciera que en este link está explicado este problema:


http://www.b4x.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html#post46745

Mira la parte que remarco en rojo en la imagen adjunta, quizás lo resuelvas haciendo la consulta como muestra en el ejemplo, sobre todo la linea que menciona el UTF-8, la siguiente no la pongas por ahora.

En la pag siguiente comentan de los problemas con las tildes y la ñ por ejemplo. Fíjate si te aclaras, sino continuo intentando ayudarte.
 

Attachments

  • ejemplo BBDD y UTF8.jpg
    ejemplo BBDD y UTF8.jpg
    90.7 KB · Views: 590
Last edited:

desof

Well-Known Member
Licensed User
Longtime User
He mirado el foro en inglés, y pareciera que en este link está explicado este problema:


http://www.b4x.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html#post46745

Mira la parte que remarco en rojo en la imagen adjunta, quizás lo resuelvas haciendo la consulta como muestra en el ejemplo, sobre todo la linea que menciona el UTF-8, la siguiente no la pongas por ahora.

En la pag siguiente comentan de los problemas con las tildes y la ñ por ejemplo. Fíjate si te aclaras, sino continuo intentando ayudarte.

Hola amigo la verdad es que no me aclara mucho por que no encuentor donde poner el code que esta alli en ese eejmplo!

Aca pongo la parte del codigo que lee a ver si lo comprendes mejor :

B4X:
Sub btBuscar_Click
   Dim im As IME       
   
   im.HideKeyboard
   ListView1.Visible=False
   
   If txBuscar.Text <> "" Then
      lbAviso.Visible=False
   Else
      lbAviso.Visible=True
      lbAviso.Text ="Ingrese algo para la búsqueda"
      txBuscar.RequestFocus
      Return
   End If
   
   ListView1.Clear     
   
   Select Case btBuscar.Tag 
      Case "nombre"
         ProgressDialogShow("Buscando por nombre...")
         ExecuteRemoteQuery("SELECT NOMBRE, TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE NOMBRE like'%" & txBuscar.Text  & "%' ORDER BY nombre", COUNTRIES_LIST)
      Case "telefono"
         ProgressDialogShow("Buscando por teléfono...")
         ExecuteRemoteQuery("SELECT NOMBRE, TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE TELEFONO LIKE'%" & txBuscar.Text & "%' ORDER BY nombre" , COUNTRIES_LIST)
      Case "domicilio"
         ProgressDialogShow("Buscando por calle...")
         ExecuteRemoteQuery("SELECT NOMBRE, TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE DOMICILIO like'%" & txBuscar.Text  & "%' ORDER BY nombre", COUNTRIES_LIST)
   End Select
'   
   
End Sub

Sub ExecuteRemoteQuery(Query As String, JobName As String)
   Dim job As HttpJob
   job.Initialize(JobName, Me)
   job.PostString("http://www.xxxxx.com.ar/fonos.php", Query)
End Sub

Sub JobDone(Job As HttpJob)
   ProgressDialogHide
   If Job.Success Then
   Dim res As String   
   Dim tmpNum As String 
   
      res = Job.GetString
      Log("Response from server: " & res)
      Dim parser As JSONParser
      parser.Initialize(res)
      Select Job.JobName
         Case COUNTRIES_LIST
            Dim COUNTRIES As List
            COUNTRIES = parser.NextArray 'returns a list with maps
            
            For i = 0 To COUNTRIES.Size - 1
               Dim m As Map
               m = COUNTRIES.Get(i)
               'We are using a custom type named TwoLines (declared in Sub Globals).
               'It allows us to later get the two values when the user presses on an item.
               Dim tl As TwoLines
               tl.First = m.Get("NOMBRE")
               tmpNum=m.Get("NUMERO")               
               If tmpNum="0" Then tmpNum="S/N"
               
               tl.Second = m.Get("TELEFONO") & " (" & m.Get("DOMICILIO") & " " & tmpNum & ")"               
               
               tmpNum=m.Get("TELEFONO") & "%" &m.Get("NOMBRE") & "%" & m.Get("DOMICILIO") & "%" & m.Get("NUMERO")
               ListView1.AddTwoLines2(tl.First, tl.Second, tmpNum)
               
            Next
      End Select
   Else
      ToastMessageShow("Error: " & Job.ErrorMessage, True)
   End If
      
   If i>0 Then
      lbAviso.Visible=False
      ListView1.Visible=True
   Else
      lbAviso.Visible=True
      ListView1.Visible=False
   End If
   
   Job.Release
   txBuscar.RequestFocus 
End Sub
 

pilbazan

Member
Licensed User
Longtime User
Hola!

En el código que has puesto, en la parte del JobDone,

B4X:
Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
    Dim res As String    
    Dim tmpNum As String 
    
        res = Job.GetString
        Log("Response from server: " & res)
.
.
.

reemplazaría el

B4X:
res = Job.GetString

por

B4X:
res = Job.GetString("UTF8")

para ver si de esta manera ya acepta todos los caracteres extraños.

Si aún sigue sacando Null, puedes activar el log y mirar lo que te sale en la linea siguiente:
B4X:
Log("Response from server: " & res)

Después de probar esas 2 cosas creo que tendremos ganado mucho. Avisanos! Gracias
 

desof

Well-Known Member
Licensed User
Longtime User
HOLA,

NO ME DEJA COMPILAR CON ESTA LINEA :
res = Job.GetString("UTF8")
ME DICEESTO:

Parsing code. * * * * * * * * * * * * * 0.02
Compiling code. * * * * * * * * * * * * Error
Error compiling program.
Error description: Array expected.
Occurred on line: 135
res = Job.GetString("UTF8")
Word: (


Y LA LINEA SIG:
Log("Response from server: " & res)
ME ARROJA ESTO EN UNA BUSQUEDA :
Response from server: [{"NOMBRE":null,"TELEFONO":"422187","DOMICILIO":null,"NUMERO":"0"}]
 
Last edited:

pilbazan

Member
Licensed User
Longtime User
HOLA,

NO ME DEJA COMPILAR CON ESTA LINEA :
res = Job.GetString("UTF8")
ME DICEESTO:

Parsing code. * * * * * * * * * * * * * 0.02
Compiling code. * * * * * * * * * * * * Error
Error compiling program.
Error description: Array expected.
Occurred on line: 135
res = Job.GetString("UTF8")
Word: (


Y LA LINEA SIG:
Log("Response from server: " & res)
ME ARROJA ESTO EN UNA BUSQUEDA :
Response from server: [{"NOMBRE":null,"TELEFONO":"422187","DOMICILIO":null,"NUMERO":"0"}]

Gracias por la prueba. Creo que viendo el log, haría un cambio en la consulta sql, de esta manera:

B4X:
ExecuteRemoteQuery("SELECT CONVERT(NOMBRE USING utf8), TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE....

Aquí, en el log, ya debería verse una salida diferente de null para Nombre. Si con eso funciona, aplicalo a todos los campos en la consulta (teléfono, domicilio y numero).
 

desof

Well-Known Member
Licensed User
Longtime User
no sigue igual

mira el log

Response from server: [{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422187","DOMICILIO":null,"NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"424444","DOMICILIO":"Ruta 13 ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422059","DOMICILIO":"Edison ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422042","DOMICILIO":null,"NUMERO":"1307"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422091","DOMICILIO":"L de la Torre ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422850","DOMICILIO":"Chacabuco ","NUMERO":"810"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"423971","DOMICILIO":"N Laprida ","NUMERO":"910"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"423604","DOMICILIO":"Las Heras","NUMERO":"1354"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422092","DOMICILIO":"San Lorenzo ","NUMERO":"931"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"423147","DOMICILIO":"Chacabuco ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422532","DOMICILIO":"Bv B Rivadavia ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422009","DOMICILIO":null,"NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"424048","DOMICILIO":"Cochabamba ","NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"424186","DOMICILIO":"Los Lapachos ","NUMERO":"120"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"423438","DOMICILIO":"J M Bullo ","NUMERO":"1402"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"429978","DOMICILIO":"J M Bullo ","NUMERO":"1402"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422447","DOMICILIO":"J M Bullo ","NUMERO":"1402"}]

No hay alguna funcion para convertirlo a luego de leido! ?

Por que no me funciona esto?
res = Job.GetString' ("UTF8")
 

desof

Well-Known Member
Licensed User
Longtime User
SABES AL UTILIZAR :
ExecuteRemoteQuery("SELECT CONVERT(NOMBRE USING UTF8), TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE NOMBRE like'%" & txBuscar.Text & "%' ORDER BY nombre", COUNTRIES_LIST)

Me devuelve todo como null incluso los que no tienen ningun carater raro!!!
 

pilbazan

Member
Licensed User
Longtime User
SABES AL UTILIZAR :
ExecuteRemoteQuery("SELECT CONVERT(NOMBRE USING UTF8), TELEFONO, DOMICILIO, NUMERO FROM TELEFONOS WHERE NOMBRE like'%" & txBuscar.Text & "%' ORDER BY nombre", COUNTRIES_LIST)

Me devuelve todo como null incluso los que no tienen ningun carater raro!!!



Lo que veo es que piensa que "CONVERT(NOMBRE USING utf8)" es el nombre de un campo y no hace la conversion a utf8, entonces todas las lineas las saca igual, es decir el servidor está sacando:

Response from server: [{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"422187","DOMICILIO":null," NUMERO":"0"},{"CONVERT(NOMBRE USING utf8)":null,"TELEFONO":"424444","DOMICILIO":"Ruta 13 ","NUMERO":"0"},

en lugar de:
Response from server: [{"NOMBRE":null,"TELEFONO":"422187","DOMICILIO":null," NUMERO":"0"},{"NOMBRE":null,"TELEFONO":"424444","DOMICILIO":"Ruta 13 ","NUMERO":"0"},...etc, indicador de que lo considera como algo que no conoce (como si no conociera el CONVERT).

Ya veré si más tarde puedo hacer alguna prueba.
Igual he visto que alguien en el PHP ha puesto justo después de definir la conexión a la bbdd:
PHP:
mysql_query("SET CHARACTER SET utf8"); ' This is the line I added

Quizás ya lo has visto en http://www.b4x.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial-27.html

Como te digo, más tarde intento mirarlo de nuevo. Saludos!
 

cjolly

Member
Licensed User
Longtime User
Hola desof,

No se si esto te puede ayudar pero dale una mirada a la pagina

Tutorial Español Programas BASIC4Android

Varias veces he consultado aqui y me ha sido de mucha ayuda, hay un ejemplo de SQL/utf8

El (Juan) deja su email para que le escriban [email protected] hace poco le escribi para comentar lo bueno que estaba la pagina y me contesto...

No se si el suele estar por este foro (b4a)
 

desof

Well-Known Member
Licensed User
Longtime User
SIIII!!!!

AL FIN!!!!!!!!

SI ESTAS CREANDO UNA APLICACION QUE UTILIZA UN BASE DATOS MYSQL PARA LOS DATOS Y FUNCIONA BIEN PERO TE CAMBIA LOS CARACTERES POR NULL COMO POR EJEMPLO:
Las palabras coN tilde o acento
Las que tienen letras ñ o Ñ
LAs que tienen un expresión de numero N° 1450

NO MODIFIQUES TU CODIGO SINO EL DEL PHP ASEGURANDONTE QUE TENGA LA LINEA
mysql_query("SET CHARACTER SET utf8");



ESTE ES UN EJEMPLO VALIDO DEL PHP RETOCADO PARA QUE ACEPTE COMPATIBILIDAD D ECARACTERES

B4X:
<?

$databasehost = "xxxxxxxx";
$databasename = "xxxxxxx_countries";
$databaseusername ="xxxxxxx_admin";
$databasepassword = "xxxxxx";

$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
mysql_select_db($databasename) or die(mysql_error());

mysql_query("SET CHARACTER SET utf8"); 

$query = file_get_contents("php://input");
//$query = $_GET["query"]; '

$sth = mysql_query($query);

if (mysql_errno()) {
    header("HTTP/1.1 500 Internal Server Error");
    echo $query.'\n';
    echo mysql_error();
}
else
{
    $rows = array();
    while($r = mysql_fetch_assoc($sth)) {
        $rows[] = $r;
    }
    print json_encode($rows);
}
?>

MUCHAS GRACIAS AMIGO pilbazan POR TU PREOCUPACIÓN EN AYUDARME
 
Last edited:

pilbazan

Member
Licensed User
Longtime User
SIIIIIIIIIIIIIIIIIIIIIIIIIIIII!!!!

AL FIN!!!!!!!!

Mofificando el PHP al fin funciona!!!!!
.
.
.

MUCHAS GRACIAS AMIGO pilbazan POR TU PREOCUPACIÓN EN AYUDARME

¡Me alegro mucho! :sign0060: Mejor si nos ayudamos en el foro y dejar las soluciones aquí para que otros también las pueda aprovechar.

Saludos
 
Top