Pages: [1]   Go Down
Author Topic: Problemas cliente Twitter con acentos, eñes y otros caracteres  (Read 1344 times)
0 Members and 1 Guest are viewing this topic.
Murcia, Spain
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas, estoy desarrollando un proyecto que consiste en un cliente de Twitter que obtenga los tweets de una cuenta de usuario y los mande por el puerto serie. Utilizo la placa Arduino UNO R3 y el Ethernet shield. La IDE que uso es la 1.0.2, el SO Windows (7 o XP, depende de donde estoy).
El código lo he sacado de aquí (http://arduino.cc/forum/index.php/topic,93480.0.html) pero lo he modificado un tanto (lo pongo al final del post), en vez de usar el del ejemplo que viene en la librería Ethernet (http://arduino.cc/en/Tutorial/TwitterClient) porque ocupa menos, da menos problemas y tiene muchísima más funcionalidad. Funciona bien, el grandísimo problema lo tengo al recibir ciertos caracteres. Por ejemplo:

Cuando escribo este tweet en Twitter:
Code:
Probando la ñ la ¿ y la ¡ por ejemplo.

En la consola me aparece esto:
Code:
Probando la ñ la ¿ y la ¡ por ejemplo.
Y así con muchos otros.

Llevo varios días probando cientos de cosas para solucionarlo, aunque lo que he intentado que tenía más lógica es que una vez que se guarda todo el tweet en el string, reemplazar esos caracteres del string por los que quiero y después imprimirlo, pero no se me ocurre cómo implementarlo bien. Y llego a la conclusión de que es mejor dejar estos "arreglos chapuceros" e ir a la raíz del problema: la URL de la API de Twitter de la cual obtengo la información. He buscado y leído algo sobre esto (la codificación UTF-8, etc.) en estos sitios: (https://dev.twitter.com/docs/counting-characters) y (https://dev.twitter.com/discussions/8246), y encuentro algunas librerías (https://github.com/twitter) como esta interesante (https://github.com/twitter/twitter-text-js) que (creo) lo solucionaría, pero están para lenguajes que no conozco como Java o Ruby y ni idea de cómo traerlas a Arduino. ¡Y ya me desespero y me indigno de verdad, porque por usar esos caracteres (por ser español) tengo una gran dificultad para terminar este proyecto bien! smiley-sad

¿Alguien tiene alguna idea de cómo puedo solucionar esto? Se lo agradecería mucho.

EDIT:
CÓDIGO:
Quote
/*
 Creado originalmente por JO3RI.
 Modificado por G3RMiCH.
 
 ***** MODIFICAR sólo los valores de las variables Ip, Dns, Gateway y Subnet *****
*/

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

byte Mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
byte Ip[] = { X, X, X, X };       //<---------MODIFICAR: Ver en cmd -> ipconfig /all y poner una distinta a la del PC (cambiar último número)
byte Dns[] = { X, X, X, X };      //<---------MODIFICAR: Ver en cmd -> ipconfig /all
byte Gateway[] = { X, X, X, X };  //<---------MODIFICAR: Ver en cmd -> ipconfig /all
byte Subnet[] = { X, X, X, X }; //<---------MODIFICAR: Ver en cmd -> ipconfig /all

EthernetClient client;        //Crea un cliente que puede conectarse al servidor para enviar y recibir datos
TextFinder finder(client, 2);    //Crea el objeto finder de la clase TextFinder

char URL[] = "api.twitter.com";      //URL del servidor al que se conecta
char usuarioTwitter[] = "tuitduino";  //<----------MODIFICAR: Nombre de usuario de Twitter
char usuario[16] = "";                //string para almacenar el Usuario
char tweet[255] = "";                //string para almacenar el Tweet
long retardo = 60000;    //Retardo entre tweets (ms). No poner menos de 30 segundos.


void setup()
{
  Serial.begin(9600);    //Abre puerto serie y establece vel. transmisión datos a 9600 bps (bits/s = baudios)
  Ethernet.begin(Mac, Ip, Dns, Gateway, Subnet);    //Inicializa librería Ethernet y opciones de red
}


void loop()
{
  Serial.println(F("Conectando al servidor..."));
  if (client.connect(URL, 80))
  {
    Serial.println(F("Conectado."));
    //Hace la solicitud GET HTTP a Twitter:
    client.print("GET /1/statuses/user_timeline.json?screen_name=");
    client.print(usuarioTwitter);
    client.println("&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com");
    client.println();  

    while (client.connected())
    {
       if (client.available())
       {
          Serial.println(F("Obteniendo tweet..."));
          if ( finder.getString("\"text\":\"", "\",\"source", tweet, 256) != 0 )  //Guarda en tweet el texto que encuentra entre "text":" y ","source
          {
              Serial.print("@");
              Serial.print(usuarioTwitter);  //Imprime el Usuario
              Serial.print(": ");
              Serial.println(tweet);  //Imprime el Tweet
          }  
       break;
      }
    }
    delay(1);
    client.stop();    //Corta la conexión con el servidor
    
    Serial.print(F("Espera "));
    Serial.print(retardo/1000);
    Serial.println(F(" segundos...\n"));
    delay(retardo);
  }
}
« Last Edit: February 09, 2013, 02:52:27 pm by G3RMiCH » Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 956
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo no he usado nunca el twiter, de hecho, si te digo la verdad no se para que sirve... bueno, se que es como unos SMS de 128 caracteres pero por internet, pero no se la aplicacion practica.

Si tienes un hueco si me gustaria me pudieras decir algun ejemplo practico donde usarlo porque te digo la verdad lo desconozco.

Respecto al problema que te ocupa, interpreto que no ves bien los caracteres "ñ" y demas en la consola serie del arduino.

Si es eso, que yo recuerde el IDE de Arduino no pemite mostrar algunos caracteres ASCII por lo que supongo que ese problema ira ligado tambien a la consola.

Mi propuesta:
  Descargate una terminal serie o varias y prueba estas a ver si lo muestran bien ellas que igual es solo tema de la consola.

De las que yo recuerde para poder probar:
    Realterm, termite, Terminalbpp, Putty, Hercules y habra mas...

Algun enlace:
https://sites.google.com/site/terminalbpp/
http://www.hw-group.com/products/hercules/index_en.html
http://www.putty.org/
http://www.compuphase.com/software_termite.htm
http://realterm.sourceforge.net/



Yo tuve un problema parecido con un micro de pic y se que tuve que cambiar la terminal para poder ver caracteres distintos pero no puedo decirte que sea el mismo caso.

Un saludo
« Last Edit: February 06, 2013, 01:39:14 am by Heke » Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Murcia, Spain
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Descargate una terminal serie o varias y prueba estas a ver si lo muestran bien ellas que igual es solo tema de la consola.

El problema no es de la consola porque cuando ejecuto este código:
Code:
void setup()
{
  Serial.begin(9600);
}


void loop()
{
  if (Serial.available() > 0)
  {
   char inChar = Serial.read();
   Serial.println(inChar);
  }
}
imprime bien TODOS los caracteres que escribo desde el teclado.
El problema es cómo recibe los caracteres de la URL, será problema de la codificación o algo, y no tengo ni idea de qué es ni de cómo solucionarlo.
Gracias por tu aporte Heke pero sigo aquí con dolor de cabeza :S
Si alguien puede echarme un cable con esto por favor que me lo diga.
Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 956
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno compañero..

Mientras esperamos una solucion desde el lado de twiter (te queda pendiente explicarme una aplicacion util con el)

En esta pagina emplean una solucion desde el lado del arduino:
http://arduino.cc/forum/index.php?topic=135969.0

Se que en la libreria ethershield tiene una clase llamada urldecode pero no se como se usa...
http://ethershield.thiseldo.co.uk/d8/d5e/class_ether_shield.html#a88ecf6dfd849c7760abbb58692af7ece
Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Madrid
Offline Offline
Sr. Member
****
Karma: 5
Posts: 481
Life isn't about finding yourself, life is about creating yourself!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo haber respondido sobre esto en otro hilo que misteriosamente se ha borrado, ponía información sobre la API de twitter que exporta caracteres especiales de html es por eso que recibes  cosas como "&#241". (en el manejo de texto no es lo mismo un microcontrolador que un PC).
Lo que tu llamas arreglos chapuzeros es lo que se viene haciendo en programación desde siempre con los caracteres ASCCI.
Resumiendo.... la chapuza la harás en arduino o al conectar al API de tweeter, tu escoges cual dominas mejor.


Logged

Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Murcia, Spain
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En esta pagina emplean una solucion desde el lado del arduino:
http://arduino.cc/forum/index.php?topic=135969.0
Gracias pero ese no es el problema que tengo Heke, el mío es que yo desde Arduino hago una solicitud GET HTTP a un servidor (Twitter) buscando un texto en concreto y el cual me lo envía a mi placa, pero algunos caracteres "no imprimibles" que no están definidos en la tabla ASCII (del 32 al 126) como la ñ, ¿, ¡, €, etc. me aparecen en formato UTF-8 (Unicode) tipo \u00ac (\uHEXADECIMAL) (he cambiado del formato del texto que recibo a .json para recibirlos así en vez de &#241;).

Se que en la libreria ethershield tiene una clase llamada urldecode pero no se como se usa...
http://ethershield.thiseldo.co.uk/d8/d5e/class_ether_shield.html#a88ecf6dfd849c7760abbb58692af7ece
La he visto y analizado con cierto esfuerzo pero lo que hace es prácticamente lo mismo que dicen en el post anterior que me has pasado.
De todas formas gracias por tus esfuerzos smiley
Ah y posibles aplicaciones... pues échale imaginación jeje. Por ejemplo para recibir directamente los tweets de una persona en concreto sin tener que estar mirando su perfil, no sé...
Logged

Murcia, Spain
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo haber respondido sobre esto en otro hilo que misteriosamente se ha borrado, ponía información sobre la API de twitter que exporta caracteres especiales de html es por eso que recibes  cosas como "&#241". (en el manejo de texto no es lo mismo un microcontrolador que un PC).
Lo que tu llamas arreglos chapuzeros es lo que se viene haciendo en programación desde siempre con los caracteres ASCCI.
Resumiendo.... la chapuza la harás en arduino o al conectar al API de tweeter, tu escoges cual dominas mejor.

Perdona yOPERO, es que le dije a mi compañero que lo preguntara en el foro pero puso el código con el que antes lo habíamos hecho, que ahora es otro (el que he puesto aquí en el primer post) y lo borró por eso xD.
He buscado, encontrado y leído (como mi medio buen inglés me lo ha permitido) sobre esto en el foto de discusiones de la API de Twitter pero no consigo entender mucho ni aclararme y mucho menos encontrar una solución. Por ejemplo:

Y sé que lo puedo arreglar calentándome la cabeza haciendo arreglos con el código, pero yo quería ir a la raíz del problema, que está en la codificación de la URL de la API. Pero al final me va a tocar hacer esas conversiones en el código.
Logged

Pages: [1]   Go Up
Jump to: