El servidor de LDAP de Netscape almacena toda la información codificada en UTF-8 lo cual generaba problemas al recuperar los datos con eñes, acentos, ... con la pasarela web500gw
Para implementar este 'pseudoparche' hemos utilizado una función en C publicada en el servidor www de iPlanet
http://developer.iplanet.com/tech/directory/utf8ltn1.html
Adaptándola mínimamente para que pueda acoplarse con web500gw, la hemos incluido en el árbol de fuentes de web500gw como utf8toLatin.c
La parte más dificil es intuir donde hay que hacer la conversión (sin la ayuda de Frank Richter, al que consultamos sin recibir respuesta alguna)
En util.c hay una función: web500gw_t61toiso(char*) en la que parece obvio que se hace la conversión.
Pero no es suficiente con esto, ya que hay otros puntos en los que también hay que realizar la conversión (p.ej. convertir el RDN o al generar una vcard)
Dado que no utilizamos web500gw para modificar los datos del directorio no nos hemos preocupado de realizar la conversión a la inversa. (sólo para recuperación)
Incluyo un diff de los dos árboles de fuentes y el utf8toLatin.c
utf8toLatin.c
---------------------- ---- utf8toLatin.c --- ---------------------- #include#include static char UTF8len[64] /* A map from the most-significant 6 bits of the first byte to the total number of bytes in a UTF-8 character. */ = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* erroneous */ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6}; unsigned char* utf8toLatin ( char* cadena) { int indice = 0; int tamanyo = strlen(cadena); int indice_salida = 0; char* resultado; /* en el peor de los casos*/ resultado = (char*)malloc (tamanyo * 6 + 1); while (indice<=tamanyo) { register int c; register unsigned long u; auto int len; c = (int) cadena[indice]; len = UTF8len [(c >> 2) & 0x3F]; indice++; switch (len) { case 6: u = c & 0x01; break; case 5: u = c & 0x03; break; case 4: u = c & 0x07; break; case 3: u = c & 0x0F; break; case 2: u = c & 0x1F; break; case 1: u = c & 0x7F; break; case 0: /* erroneous: c is the middle of a character. */ u = c & 0x3F; len = 5; break; } while (--len && (indice<=tamanyo)) { c= (int) cadena[indice]; indice++; if ((c & 0xC0) == 0x80) { u = (u << 6) | (c & 0x3F); } else { /* unexpected start of a new character */ indice--; break; } } if (u <= 0xFF) { //Anyado el caracter a la salida resultado[indice_salida++] = (char) u; resultado[indice_salida] = '\0'; } else { /* this character can't be represented in Latin-1 */ resultado[indice_salida++] = '?'; resultado[indice_salida] = '\0'; } if (indice == tamanyo) break; } return resultado; } ----------------------
diff -rw web500gw-2.1b3_PARCHEADO/ web500gw-2.1b3/
------------------------------------------------------------------ ---- diff -rw web500gw-2.1b3_PARCHEADO/ web500gw-2.1b3/ ---------- ------------------------------------------------------------------ diff -rw web500gw-2.1b3_PARCHEADO//Makefile web500gw-2.1b3/Makefile 121c121 < SRCS = web500gw.c read.c search.c bind.c modify.c add.c delete.c modrdn diff -rw web500gw-2.1b3_PARCHEADO//Makefile web500gw-2.1b3/Makefile 121c121 < SRCS = web500gw.c read.c search.c bind.c modify.c add.c delete.c modrdn .c utf8toLatin.c\ --- > SRCS = web500gw.c read.c search.c bind.c modify.c add.c delete.c modrdn.c\ 124c124 < OBJS = web500gw.o read.o search.o bind.o modify.o add.o delete.o modrdn.o utf8toLatin.o\ --- > OBJS = web500gw.o read.o search.o bind.o modify.o add.o delete.o modrdn.o \ diff -rw web500gw-2.1b3_PARCHEADO//dir_util.c web500gw-2.1b3/dir_util.c 354,355c354 < //Convierte a Latin1 el rdn < rdn = utf8toLatin(rdn); --- > Common subdirectories: web500gw-2.1b3_PARCHEADO//doc and web500gw-2.1b3/doc Common subdirectories: web500gw-2.1b3_PARCHEADO//etc and web500gw-2.1b3/etc diff -rw web500gw-2.1b3_PARCHEADO//ldap2html.c web500gw-2.1b3/ldap2html.c 751c751 < outval = utf8toLatin(vals[i]); --- > outval = vals[i]; Only in web500gw-2.1b3_PARCHEADO/: utf8toLatin.c Common subdirectories: web500gw-2.1b3_PARCHEADO//util and web500gw-2.1b3/util diff -rw web500gw-2.1b3_PARCHEADO//util.c web500gw-2.1b3/util.c 148c148 < return (unsigned char *)utf8toLatin(in); --- > return (unsigned char *)in; diff -rw web500gw-2.1b3_PARCHEADO//web500gw.h web500gw-2.1b3/web500gw.h 211,213d210 < /* utf8toLatin.c */ < extern unsigned char *utf8toLatin(); <