Ver Mensaje Individual
  #1  
Antiguo 01-06-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
String, PChar y UNICODE

A las wenas.

Por fin, este fin de semana culmino mi mudanza y podré disponer de mi ordenador. ¡Viva! Así que voy a poder trabajar en cosas que tenía estancadas desde hace meses. Después de esta información de interés general , voy a la pregunta. Al principio parece complicada, pero no creo que sea muy difícil dar con una solución. Lo que pasa es que después de tanto tiempo pues estoy desentrenado.

Estoy creando una envolvente para una librería. Dicha librería permite el uso de UNICODE en distintos formatos (ASCII, UTF-8, UTF-16 y UTF-32). Por ahora estaba utilizando PChar ya que era lo más flexible (además, la librería está escrita en C y este tipo se ajusta muy bien a este lenguaje) pero utilizar esto no permite manejar las cadenas como en Pascal (p.ej. no puedo escribir Cadena := Cadena1 + Cadena2; con lo que realizar concatenaciones y comparaciones se complica bastante). Sé que Delphi tiene un tipo de cadena para utilizar UNICODE, pero me preocupa que luego no pueda pasar estas cadenas a la librería por incompatibilidad. Para que os hagáis una idea, estaba pensando en algo como esto:
Código Delphi [-]
UNIT ejemploLibreriaCadenas;

INTEFACE
  PROCEDURE ProcedimientoCadena (Cadena: STRING);

IMPLEMENTATION

{ Este es el enlace a la función C que quiero llamar. }
  PROCEDURE _ProcedimientoCadena_C_ (Cadena: PCHAR); CDECL; EXTERN 'libreria.dll' NAME 'procedimiento_cadena';

{ Este es el 'molde' que voy a utilizar. }
  PROCEDURE ProcedimientoCadena (Cadena: STRING);
  VAR
    CadenaTmp: PCHAR;
  BEGIN
  { Transformamos el STRING en un PCHAR que pueda ser manejado como
    cadena en C. }
    Cadena := Cadena + #0: { En C una cadena termina con el carácter 0. }
    CadenaTmp := PCHAR (@Cadena[1]);
  { Ahora ya podemos llamar al procedimiento. }
    _ProcedimientoCadena_C_ (CadenaTmp);
  END;

END.
Sé que esto (o algo muy similar) funciona porque ya lo utilicé una vez. Mi incógnita es: ¿Qué tipo de datos utiliza Delphi para manejar las cadenas UNICODE? ¿Y alguno de vosotros sabe cómo almacena esta cadena en memoria en los distintos formatos (ASCII, UTF-8, UTF-16 y UTF-32)?

Casi lo olvido: Gracias por adelantado.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 01-06-2007 a las 16:12:08.
Responder Con Cita