iris-ldap

Modificación de web500gw para convertir de UTF-8 a Latin1

por Eduardo Bergasa Balda (unirioja)

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();
<