2010-02-09 8 views
8

Por lo tanto, estoy trabajando en un proyecto plain-C (ANSI 9899: 1999), y estoy tratando de averiguar por dónde empezar re: Unicode, UTF-8 y todo ese jazz.¿Dónde puedo comenzar con la programación amigable para Unicode en C?

Específicamente, es un proyecto de intérprete de idiomas, y tengo dos lugares principales donde tendré que manejar Unicode: leer en archivos fuente (el lenguaje ostensiblemente admite identificadores Unicode y similares) y en objetos 'de cadena'.

Estoy familiarizado con todos los fundamentos obvios sobre Unicode, UTF-7/8/16/32 & UCS-2/4, y así sucesivamente ... Estoy buscando principalmente C específica (es decir, por favor no C++ o C#, que es todo lo que se ha documentado aquí en SO anteriormente) recursos en cuanto a mis 'próximos pasos' para implementar cosas Unicode-friendly ... en C.

Cualquier enlace, página de manual, artículos de Wikipedia, código de ejemplo, es muy bienvenido. También trataré de mantener una lista de dichos recursos aquí en la pregunta original, para cualquiera que lo encuentre más tarde.


+0

+1 para iconv, donde está disponible. en Windows icu podría ser una mejor opción –

Respuesta

10

International Components for Unicode proporciona una biblioteca portátil C para el manejo de Unicode. Aquí está la presentación de su ascensor para ICU4C:

Los lenguajes C y C++ y muchos entornos de sistemas operativos no ofrecen un soporte completo para Unicode y servicios de manejo de texto que cumplen con los estándares. Aunque algunas plataformas proporcionan buenos servicios de manejo de texto Unicode, el código de la aplicación portátil no puede hacer uso de ellos. Las bibliotecas de ICU4C llenan este espacio. ICU4C proporciona una base abierta, flexible y portátil para que las aplicaciones puedan utilizar sus requisitos de globalización de software. ICU4C sigue de cerca los estándares de la industria, incluidos Unicode y CLDR (Common Locale Data Repository).

+0

He oído hablar de eso (creo que Joel lo mencionó en el enlace que agregué a la primera publicación) ... Tengo miedo de tocar cualquier cosa IBM, sin embargo, parecen tender hacia el software monolítico . Estoy más buscando cosas de stdlib-C, consejos, y cosas así, que bibliotecas ... Estoy tratando de mantener mis dependencias realmente livianas para este proyecto. Dicho esto, los agregaré a la publicación original, pueden ser útiles para otros. ¿Qué tan pesados ​​* son * la UCI? Tal vez si son realmente livianas/simples, vale la pena el tiempo ... – ELLIOTTCABLE

+0

ICU es el estándar de la industria que no es de Microsoft en el procesamiento de Unicode, no es necesario que escuche. Aunque la curva de aprendizaje es empinada. Por cierto: si solo le interesa transportar y representar Unicode correctamente, no necesita ICU. ICU se trata de trabajar con Unicode. –

+1

Específicamente, creo que en este momento particular, el mínimo que tengo que hacer es leer en (al menos) los archivos UTF-8/ASCII y convertirlos a una representación interna, tokenizada, UTF-32 'cadena'. ¿Puedo fácilmente (-ish) hacer esto * sin * ICU, o con algo más ligero? – ELLIOTTCABLE

0

Creo que una de las preguntas interesantes es: ¿cuál debería ser su formato interno canónico para cadenas? Las 2 opciones obvias (al menos para mí) son

a) utf8 en vainilla c-cuerdas b) utf16 en matrices cortas sin firmar

En proyectos anteriores siempre he elegido UTF-8. Por qué ; porque es el camino de menor resistencia en el mundo C. Todo lo que está interactuando (stdio, string.h, etc.) funcionará bien.

Ahora viene - qué formato de archivo.El problema aquí es que es visible para sus usuarios (a menos que proporcione el único editor para su idioma). Aquí supongo que tienes que tomar lo que te dan y tratar de adivinar mirando a escondidas (ayuda de marcas de orden de bytes)

3

GLib tiene algo de Unicode functions y es una biblioteca bastante liviana. No está cerca del mismo nivel de funcionalidad que proporciona ICU, pero podría ser lo suficientemente bueno para algunas aplicaciones. Las otras características de GLib también son buenas para los programas C portátiles.

GTK + está construido en la parte superior de GLib. GLib proporciona las construcciones de lenguaje algorítmicas fundamentales comúnmente duplicadas en las aplicaciones. Esta biblioteca tiene características tales como (esta lista no es una lista exhaustiva):

  • sistema de tipo de objeto y
  • bucle principal
  • la carga dinámica de los módulos (es decir, los plug-ins)
  • apoyo Thread
  • apoyo temporizador
  • asignador de memoria
  • roscados colas (síncrona y asíncrona)
  • listas (de enlace simple, doblemente enlazada, dos casquillos)
  • Las tablas hash
  • Arrays
  • Trees (N-ary y binario equilibrado)
  • utilidades de cuerda y charset manipulación
  • escáner léxico y XML parser
  • Base64 (codificación & decodificación)
Cuestiones relacionadas