Linux - Explicación

 
Vista:

Explicación

Publicado por may (9 intervenciones) el 03/12/2006 11:03:16
Siento no haber dejado clara mi consulta. Lo que me gustaría hacer es tratar las cadenas de caracteres y hacer que todas sus vocales con tilde pasen a ser vocales simples. El problema es que las vocales acentuadas las trata como carácteres especiales y la comparación 'á' == 'á' siempre es falsa.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Explicación

Publicado por n0str0m0 (1503 intervenciones) el 06/12/2006 23:37:50
El asunto está en cómo definas o trabajes con las distintas letras, pero la comparación 'à'==''a' es siempre verdadera, al menos en mi sistema.

La razón entre otras cosas es que mi codificación UTF establece que este tipo de caracteres es de más de un byte, pero las variables a comparar son character, de ahí que obtenga al compilar:

warning: multi-character character constant

Pero si haces lo siguiente, verás que la comparación funciona bien.

160 es el código ASCII para el carácter 'á'
#include <stdio.h>

int main()
{

char letraa, letrab;

letraa=letrab=160;

printf("¿%d==%d?\n",letraa,letrab);

if(letraa==letrab)
printf("si\n");
else
printf("no\n");

return 0;
}

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por may (9 intervenciones) el 07/12/2006 19:03:13
Hola. Siento ser tan pesada. He tenido en cuenta vuestros consejos y algunas de las dudas planteadas anteriores a la mía, pero no consigo hacer funcionar mi programa. Para tratar vocales con tilde he usado caracteres de tipo wchar_t y por tanto, todas las operaciones que uso son del tipo wprintf, wscanf, etc. Además, antes de todo esto he usado la función fwide para modificar el flujo de datos y que éste trate caracteres anchos, pero aún así, si intento imprimir cadenas con tildes por pantalla se muestra un signo de interrogación en lugar del caráter tildado. También me ocurre lo mismo con la función wscanf, si introduzco por pantalla una cadena que incluya tildes no se almacena correctamente. El problema es el mismo en operaciones de comparación y copia. ¿Cómo podría solucionarlo?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (10 intervenciones) el 08/12/2006 16:14:22
¿ Qué codificación usas en tu terminal de consola ?

Ejecuta 'locale' y a ver qué sale. Como es lógico, tu programa y la consola deben usar el mismo juego de códigos de caracteres.

Este es el que yo uso:

$ locale
LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por may (9 intervenciones) el 09/12/2006 11:22:36
Hola Tom. Gracias por tu consejo. He ejecutado locale como dijiste y los valores mostrados son iguales a los que expusiste en tu post. He seguido trabajando en ello pero sigo sin dar con el problema. Además, como dije en un principio lo que me interesaba era poder imprimir por pantalla caracteres tildados y tratarlos. Al imprimir se muestra '?' en lugar de la vocal acentuada, con lo cual hasta ahora no he conseguido nada. También he intentado acceder a cadenas de caracteres de tipo wchar_t en distintas posiciones, es decir, cadena[i], y encontré un problema aún mayor. Al parecer los caracteres de una cadena son almacenados en arrays bidimensionales y si intento mostrar la cadena mostrando cada uno de sus caracteres se muestran de forma desordenada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (482 intervenciones) el 11/12/2006 11:44:36
Lo que te quiería decir es que tu programa _debe_ utilizar el mismo locale que la consola (no que tenga que ser ese, que solo era un ejemplo).

¿ Has mirado la función setlocale() ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (482 intervenciones) el 11/12/2006 15:27:30
Pues me has picado, y lo he probado. Sin hacer nada especial, a mí me funciona perfectamente:

#include <stdio.h>

/* */
int main(int argc, char *argv[]) {
char buffer[65];

printf("Hijo nací, tercerón ...\n");
fgets(buffer, 65, stdin);
printf(buffer);
}

/tmp$ make pr
cc pr.c -o pr
/tmp$
/tmp$ ./pr
Hijo nací, tercerón ...
... de un hidalgo pobretón.
... de un hidalgo pobretón.
/tmp$

¿ Qué tipo de terminal usas, xterm quizás ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por may (9 intervenciones) el 13/12/2006 13:56:27
Gracias por tu ayuda. Con respecto a tu pregunta, sí estoy usando xterm. Pero tengo alguna duda. Soy principiante con Linux y no sé cómo distinguir entre el valor para locale en mi programa y en la consola, ¿basta con comprarar el valor devuelto por getlocale() y locale?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (482 intervenciones) el 13/12/2006 14:40:48
Bueno, setlocale() admite parámetros NULL o vacíos ("") de manera que lee la conficuración de las variables de entorno vigentes cuando lanzas tu programa.
Esta es la forma más fácil de conseguir que tu prog. use la misma codificación que el terminal desde donde lo lanzas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por may (9 intervenciones) el 17/12/2006 19:33:03
Hola, muchísimas gracias por tus consejos Tom, por fin conseguí tratar tildes. Ahora se me plantea una nueva duda que no tiene que ver con las expuestas anteriormente, pero pensé que quizás estarían relacionadas. Quiero almacenar en contenido de un fichero en una cadena de caracteres de tipo wchar_t. Para ello en primer lugar calculo el tamaño del fichero. Hago uso de la función fseek(f, 0, SEEK_END). El problema es que cuando trabajaba con caracteres simples funcinaba correctamente y ahora que lo hago con caracteres extendidos mi programa se queda colgado en esta operación, ¿es posible que tengan algo que ver?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (482 intervenciones) el 18/12/2006 07:49:54
¿¿¿ Se queda colgado en el fseek ???
Para ver el tamaño de un fichero lo mejor es usar fstat()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por may (9 intervenciones) el 19/12/2006 18:56:27
Hola de nuevo. He puesto en práctica tus consejos y me han sido de gran ayuda, pero sigo trabajando y me surjen nuevas dudas. Por fin conseguí leer de ficheros. Para ello estoy usando la función fread. La llamada que hago en mi programilla es la siguiente:
fread(buffer, sizeof(wchar_t), tam_fichero, g)
Antes de esto he obtenido el tamaño del fichero y lo he almacenado en tam_fichero y he reservado la correspondiente memoria para buffer, pero no consigo leer el fichero al completo, sino que la función lee solamente hasta el primer carácter acentuado. Como sugeriste, usé la función setlocale(), ¿cuál es el problema ahora?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicación

Publicado por Tom (482 intervenciones) el 22/12/2006 08:15:53
No sé cual es el problema. ¿Cómo está escrito el fichero que tratas de leer? Porque el tamaño del fichero es en bytes, no en caracteres. Si wchar_t ocupa dos bytes, deberías dividir entre dos el tamaño total del archivo.

Mira, sobre Unicode puedes leer algo interesante aquí:
http://www-128.ibm.com/developerworks/linux/library/l-linuni.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar