En este código del post Guardar y leer EEPROM de un array y lee cosas raras:
#include <EEPROM.h>
const unsigned char PROGMEM ALFANUMERICO[] =
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-', '_', ':', ';',
'¿', '?', '(', ')', '[', ']', '{', '}', '=', '
Hemos declarado el array como unsigned char, por lo tanto es un byte. A la hora de leerlo y grabarlo en memoria lo interpreta como byte. Como el valor UTF-8 de 'ñ' es 0x3CB1, solo lee y guarda la parte baja, es decir, 0xB1.
Se me ocurre que el compilador trata de una manera especial la codificación UTF8. Así cuando ponemos un caracter fuera del ASCII de 7 bits (que es un conjunto de UTF-8), el compilador lo interpreta como un unsinged long (32 bits). A partir que aqui, dependiendo de como lo tratemos lo interpretará de manera diferente:
-
Si le preguntamos el tamaño con sizeof('ñ') este será 2.
-
Si lo imprimimos como un caracter nos dará FFFFC3B1 o -15439. dependiendo de si usamos HEX o no, usando los 32 bits.
-
Si lo usamos en una cadena, por ejemplo "gañan", el tamaño de la cadena es 6. Al imprimirlo por serial sustitye la 'ñ' por dos bytes (utf-8 de la 'ñ') y muestra dos caracteres raros.
Ahora bien, cuando el proceso es al revés, lo enviamos a través del terminal del IDE hacia al Arduino, ocurre algo maravilloso y desconcertante: sólo recibimos un caracter, si mostramos el valor en hex nos da que para la 'ñ' recibimos 0xF1 y para la 'Ñ' nos da 0xD1, que resulta ser el valor UNICODE.
Da que pensar el tema...
, '&', '"', ' '
};
void setup() {
Serial.begin(9600);
}
void loop() {
// Leemos el array de la memoria flash, byte a byte, lo mostramos por el puerto
// serie y a la vez lo grabamos en la eeprom.
for (int i=0; i<80; i++) {
Serial.print((char)pgm_read_byte(ALFANUMERICO+i));
EEPROM.update(i, (byte)pgm_read_byte(ALFANUMERICO+i));
Serial.print(" ");
}
Serial.println();
delay(5000);
//Leemos el array de la EEPROM y lo mostramos por el puerto serie.
for (int i=0; i<80; i++) {
Serial.print((char)EEPROM.read(i));
Serial.print(" ");
}
Serial.println();
}
Hemos declarado el array como unsigned char, por lo tanto es un byte. A la hora de leerlo y grabarlo en memoria lo interpreta como byte. Como el valor UTF-8 de 'ñ' es 0x3CB1, solo lee y guarda la parte baja, es decir, 0xB1.
Se me ocurre que el compilador trata de una manera especial la codificación UTF8. Así cuando ponemos un caracter fuera del ASCII de 7 bits (que es un conjunto de UTF-8), el compilador lo interpreta como un unsinged long (32 bits). A partir que aqui, dependiendo de como lo tratemos lo interpretará de manera diferente:
- Si le preguntamos el tamaño con sizeof('ñ') este será 2.
- Si lo imprimimos como un caracter nos dará FFFFC3B1 o -15439. dependiendo de si usamos HEX o no, usando los 32 bits.
- Si lo usamos en una cadena, por ejemplo "gañan", el tamaño de la cadena es 6. Al imprimirlo por serial sustitye la 'ñ' por dos bytes (utf-8 de la 'ñ') y muestra dos caracteres raros.
Ahora bien, cuando el proceso es al revés, lo enviamos a través del terminal del IDE hacia al Arduino, ocurre algo maravilloso y desconcertante: [u]sólo recibimos un caracter[/u], si mostramos el valor en hex nos da que para la 'ñ' recibimos 0xF1 y para la 'Ñ' nos da 0xD1, que resulta ser el valor UNICODE.
Da que pensar el tema...