2010-09-15 37 views
5

Tengo una pregunta simple que no puedo encontrar en Internet, ¿cómo puedo convertir UTF-8 en ASCII (caracteres acentuados en su mayoría al mismo carácter sin acento) en C usando solo la lib estándar? Encontré soluciones para la mayoría de los idiomas, pero no para C en particular.UTF-8 -> ASCII en lenguaje C

Gracias!

EDITAR: Algunos de los tipos amables que me comentaron me hicieron verificar dos veces lo que necesitaba y exageré. Solo necesito una idea sobre cómo hacer una función que sí lo haga: char con acento -> char sin acento. :)

+0

No está en la biblioteca estándar, por lo que debe especificar qué plataformas realmente necesita para que funcione. –

+0

Probablemente Linux. – dccarmo

+1

@dccarmo - El estándar C no es, p. el estándar Posix. Estar disponible en Linux, o incluso ser ordenado por Posix, no lo convierte en una biblioteca estándar * C *. – Steve314

Respuesta

2

No hay una forma integrada de hacer eso. Hay muy poca diferencia entre UTF-8 y ASCII a menos que esté hablando de caracteres de alto nivel, que de todos modos no pueden representarse en ASCII.

Si tiene una asignación específica que desea (como a con acento -> a), entonces probablemente debería manejar eso como una operación de reemplazo de cadenas.

+0

Pero cuando intento hacer un if (c == 'á') {c = 'a'; } me da "la comparación es siempre falsa debido al rango limitado de tipo de datos" :( – dccarmo

+0

@dccarmo: ''á'' se parece a'' \ 0703 \ 0120'' a C, por lo que es una constante que es más grande que un 'char' puede contener, entonces si' c' es un char no hay forma de que sea igual a eso. Lo que es probable que sea igual a ''\ 0703'' y el siguiente caracter en tu stream sería' '\ 0120' '. – nategoose

+0

@nategoose: elimine esos ceros a la izquierda; no son válidos en C octal char escapes. '\ 0703 \ 0120' se analiza como' \ 070', '3',' \ 012', ' 0'. –

5

Eche un vistazo a libiconv. Incluso si insiste en hacerlo sin bibliotecas, puede encontrar una inspiración allí.

+0

Creo que eso viola "usar solo la lib estándar" –

+0

@Billy - no si solo una persona lee las fuentes de libiconv (por ejemplo, para copiar rangos de código). – Steve314

+0

Lo voy a ver, gracias! – dccarmo

4

En general, no se puede. UTF-8 cubre mucho más que los caracteres acentuados.

2

Cada biblioteca de soporte decente de Unicode (no la biblioteca estándar, por supuesto) tiene una forma de descomponer una cadena en formato KC o KD. Que separa los signos diacríticos de las letras. Te da una oportunidad de filtrarlos. No estoy tan seguro de que valga la pena perseguirlo, el resultado es solo un galimatías para el lector del idioma nativo y no todas las letras son descomponibles. En otras palabras, basura con signos de interrogación.

+0

Sí, exageré en mi pregunta. Realmente solo quiero convertir acentos char -> char sin acento. Odio a mi profesor por solo permitirnos hacer esto con la lib estándar y también en C. Si solo pudiera usar Python. :( – dccarmo

+2

Has elegido la clase incorrecta, no puedo ayudarte con eso. –

2

Dado que esta es una tarea, supongo que su profesor no tiene ni idea y no sabe nada sobre UTF-8, y probablemente esté atrapado en la década de 1980 con "páginas de códigos" y "ASCII extendido" (palabras que debería borrar de tu vocabulario si no lo has hecho aún). Es probable que su maestro quiera que escriba una tabla de búsqueda de 128 bytes que asigna CP437 o Windows-1252 bytes en el rango de 128-255 a letras ASCII de aspecto similar. Sería algo así como ...

void strip_accents(unsigned char *dest, const unsigned char *src) 
{ 
    static const unsigned char lut[128] = { /* mapping here */ }; 
    do { 
     *dest++ = *src < 128 ? *src : lut[*src]; 
    } while (*src++); 
}