2012-06-08 54 views
6

Tengo una comprensión básica de UTF8: los puntos de código tienen una longitud variable, por lo que un "carácter" puede ser de 8 bits, 16 bits o incluso más.Procesamiento UTF8 en C

Lo que me pregunto es si hay algún código de muestra, biblioteca, etc. en lenguaje C que haga cosas similares a una cadena UTF8 como biblioteca estándar en C. E.g. decir la longitud de la cadena, etc.

Gracias,

+1

Para la longitud, vea p. ej. http://stackoverflow.com/q/5117393/440558 –

+1

Tenga en cuenta que, por ejemplo, strlen() funciona perfectamente bien en datos codificados en utf-8, le da la longitud de la cadena uft-8. Sin embargo, no le da la cantidad de caracteres Unicode en esa cadena. – nos

+0

algunos más enlaces de stackoverflow http://stackoverflow.com/questions/1031645/how-to-detect-utf-8-in-plain-c, http://stackoverflow.com/questions/4607413/c-library- to-convert-unicode-code-points-to-utf8/4609989 y un fragmento de código que escribí hace unas semanas https://bitbucket.org/cggaertner/libtcu/raw/5ea138154ba5/utf8z.h – Christoph

Respuesta

1

La biblioteca más importante para el manejo de Unicode es IBM's ICU.

Pero si todo lo que necesita hacer es determinar el número de puntos de código en una cadena codificada en UTF-8, contar el número de caracteres con valores entre \x01 y \x7F o entre \xC2 y \xFF.

+2

'\ xC2' a' \ xF4', en realidad - Unicode se detiene en 'U + 10FFFF'. Probablemente sea más fácil simplemente descontar los bytes de continuación, y puede hacerlo con una sola operación: 'c & \ xC0! = \ X80'. – ecatmur

+0

Claro, o, suponiendo que los caracteres estén firmados, 'C> = '\ xC2'' –

+1

Además, Unicode es más que un juego de caracteres. También debe tener en cuenta cosas como _canonical equivalence_ (donde debe tratar una cadena que contenga, por ejemplo, 'U + 0178' como idéntica a una que contenga' U + 0059' 'U + 0308' aunque la primera tenga 2 bytes de longitud en UTF-8 y el segundo 3 bytes). Pero eso podría estar fuera del alcance de esta pregunta. –

4

GNU tiene una biblioteca de cadenas Unicode, llamada libunistring, pero no maneja nada tan bien como ICU.

Por ejemplo, la biblioteca GNU ni siquiera le da acceso a la intercalación, que es la base para todas las comparaciones de cadenas. Por el contrario, la UCI lo hace. Otra cosa que la UCI tiene que GNU no aparece es expresiones regulares Unicode. Para eso, es posible que desee utilizar Phil Hazel’s excellent PCRE library for C, que se puede compilar con soporte UTF-8.

Sin embargo, es posible que la biblioteca de GNU sea suficiente para lo que necesita. No me gusta mucho su API. Muy desordenado. Si le gusta la programación en C, puede probar el Go programming language, que tiene una excelente compatibilidad con Unicode. Es un lenguaje nuevo, pero pequeño, limpio y divertido de usar.

Por otro lado, los principales lenguajes interpretados - Perl, Python y Ruby - todos tienen soporte variable para Unicode que es mejor de lo que siempre obtendrás C. De ellos, el soporte Unicode de Perl es el más desarrollado y robusto.

Recuerde: no es suficiente para admitir más caracteres. Sin las reglas que los acompañan, no tienes Unicode. A lo sumo, puede tener ISO 10646: un repertorio de caracteres grandes pero sin reglas. Mi mantra es "Unicode no es solo más personajes; es más caracteres más un montón de reglas para su manejo. "