cadenas de caracteres y utf-8

Consulte acerca de programas, técnicas, algoritmos etc.

cadenas de caracteres y utf-8

Notapor carleto » Vie Dic 11, 2009 10:33 pm

Hola

Me ha surgido un problemilla con el formato utf-8, llevo ya usadas las funciones que Hugo me comenta en un anterior mensaje mio para personalizar tipos de letras: http://www.losersjuegos.com.ar/foro/viewtopic.php?t=602

Hasta ahora usaba Dev-C++ y no había tenido problema. Hace poco conocí el editor Geany, y como me gusta probarlo todo, pues en ello estoy. Este editor me crea los archivos con el formato utf-8 y al ir a usar las funciones anteriores me surge un problema, no me imprime las vocales acentuadas y algunos caracteres especiales, bueno, si las imprime, pero, por ejemplo, por cada vocal acentuada, imprime dos caracteres.

Si miro la longitud de las cadenas de texto, me dan un carácter más por cada acento, por ejemplo, la cadena "así" me dice que tiene 4 caracteres.

Así que ¿cómo puedo solucionar esto? Usando utf-8, claro o ¿tengo que convertir todos los archivos de los fuentes a ANSI?

Saludos
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España

Notapor carleto » Lun Dic 14, 2009 12:55 pm

Hola de nuevo.

Un pequeñísimo ejemplo, el siguiente código:

Código: Seleccionar todo
#include <stdio.h>

int main(int argc, char** argv)
{
   char cadena[] = "Así";

   printf("Cadena: %s", cadena);
   printf("\nLongitud: %d", strlen(cadena));

   printf("\n\nPulse una tecla");
   getchar();

   return 0;
}


Si lo guardo en un archivo de formato utf-8 y lo compilo, el resultado es que la longitud de la cadena es 4. Pero si ese mismo código lo guardo en formato ANSI me da como resultado 3.

He probado compilando en linux y windows y el resultado es el mismo.

Mi duda es si es mejor guardar el código en formato ANSI o hay alguna forma de que el código funcione bien usando utf.

Saludos
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España

Notapor Geo » Mié Dic 16, 2009 5:21 am

¿Qué compilador usas en Windows? Esto funciona en VC++ 2008:
Código: Seleccionar todo
#include <stdio>
#include <stdlib>
#include <string>

int main() {

   char cadena[] = "Así";

   //printf( "Cadena: %s\n", cadena );
   printf( "Longitud: %d\n", strlen( cadena ) );

   system( "pause" );
   return 0;
}


Longitud: 3
Press any key to continue...


El problema con tu compilador podría ser la localización (en VC++ es necesario ajustarla para que los caracteres se impriman correctamente), pero habría que probar.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor Geo » Mié Dic 16, 2009 6:56 am

Ya pude probar en Linux (supongo que en Windows usaste MinGW), el problema es que la función strlen no devuelve el número de caracteres, sino el número de bytes. Para contar el número de caracteres de una cadena UTF-8 se puede hacer así:

Código: Seleccionar todo
#include <stdio>
#include <stdlib>
#include <string>

#include <locale>

int main( ) {
   char cadena[] = "Así";

   // Necesario indicar la localización, si no se hace se utilizarán
   // caracteres de 1 byte
   setlocale( LC_ALL, "" );

   printf( "Cadena: %s", cadena );
   printf( "\nLongitud: %d (bytes)", strlen( cadena ) );
   printf( "\nCaracteres: %d", mbstowcs( NULL, cadena, 0 ) );

   printf( "\n\n" );

   return 0;
}


Además, es necesario indicar la localización con setlocale, si no se hace, no funcionará correctamente (puedes hacer la prueba). En el ejemplo que pongo, se configura la localización a la del sistema, puede ser necesario que se indique explícitamente.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

[solucionado]

Notapor carleto » Sab Dic 19, 2009 8:54 am

Hola de nuevo

Bueno, ante todo, perdón por la tardanza en contestar, pero es que en estas fechas se anda algo escaso de tiempo :wink:

Pues sí, eso era lo que buscaba, ahora funciona correctamente todo. Muchas gracias.

Pásenlo bien estas fiestas ¡¡¡ Feliz Navidad !!
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron