Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
String, AnsiString, Ascii y la madre de Embarcadero

Buenas a todos.

No se si os habrá pasado a vosotros, pero a mi me tiene frito y no encuentro solución (de momento), además, creo que la culpa es de mis padres (R.I.P.) y de la madre que pario a los de Embarcadero.

El caso es que mi nombre es César, si, con acento en la letra E y lógicamente lo uso como tal (se que algún forero es muy crítico con los acentos)

¿Que me pasa? que si mando una cadena con mi nombre a ... digamos un socket no se envia "César" sino "CÚsar', ¿Comorrrr? Investigo, investigo, mucho, pero mucho. Y la conclusión a la que he llegado es la siguiente:

Que necesito enviar la siguiente secuencia ASCII (67, 130, 115, 97, 114) osea "César" y que me pasa ... que sale (67, 233, 115, 97, 114) osea "CÙsar".

Da igual como defina la cadena, ShortString, AnsiString, String, UnicodeString, WideString, array of char, array of byte, array of word, siempre que miro el carácter me devuelve 233 en vez de 130.

¿Se os ocurre como solucionarlo?

Gracias por adelantado.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #2  
Antiguo 20-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
cesarsoftware,

Cita:
Empezado por cesarsoftware
...si mando una cadena con mi nombre a...digamos un socket no se envia "César" sino "CÚsar'...(67, 130, 115, 97, 114) osea "César"...sale (67,233, 115, 97, 114) osea "CÙsar"...
Te comento: El ordinal 130 corresponde al carácter "," y el ordinal 233 corresponde al carácter "é".

Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
   A1 : Array[1..5] of Byte = (67,233,115,97,114);
   A2 : Array[1..5] of Byte = (67,218,115,97,114);

var
   i : Integer;
   AuxStr : String;
   Secuencia : String;

begin

   // 1- Secuencia 'César' en Representación Ordinal

   Secuencia := EmptyStr;
   AuxStr := 'César';

   for i := 1 to Length(AuxStr) do
      Secuencia := Secuencia + IntToStr(Ord(AuxStr[i])) + ',';

   ShowMessage(Secuencia + ' = ' + '67,233,115,97,114,');

   // 2- Arreglo (67,233,115,97,114) en Representación de Carácteres

   Secuencia := EmptyStr;

   for i := Low(A1) to High(A1) do
      Secuencia := Secuencia + Chr(A1[i]);

   ShowMessage(Secuencia + ' = ' + 'César');

   // 3- Secuencia 'CÚsar' en Representación Ordinal

   Secuencia := EmptyStr;
   AuxStr := 'CÚsar';

   for i := 1 to Length(AuxStr) do
      Secuencia := Secuencia + IntToStr(Ord(AuxStr[i])) + ',';

   ShowMessage(Secuencia + ' = ' + '67,218,115,97,114,');

   // 4- Arreglo (67,218,115,97,114) en Representación de Carácteres

   Secuencia := EmptyStr;

   for i := Low(A2) to High(A2) do
      Secuencia := Secuencia + Chr(A2[i]);

   ShowMessage(Secuencia + ' = ' + 'CÚsar');

end;
El código anterior en Delphi 7 sobre Windows 7 Professional x32, representa la secuencia (C, é, s, a, r) en valores ordinales (67, 233, 115, 97, 114) y la secuencia (C,Ù,s,a,r) en valores ordinales (67, 218, 115, 97, 114) según lo esperado, Pregunto: ¿Las secuencias de carácteres del código anterior se representan correctamente en sus valores ordinales en tu sistema?.

Revisa este link:
Cita:
ASCII Code - The extended ASCII table : http://www.ascii-code.com/
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 20-09-2013 a las 23:03:38.
Responder Con Cita
  #3  
Antiguo 23-09-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Gracias Nelson por contestar, luego comprobaré el código que planteas, pero creo que por lo que dices en nuestra máquina/windows es asi, pero no en el resto.

Es decir, cuando un telnet remoto conecta con mi aplicación, recibe ese ascii 233 en vez del 130 que el espera, no se mi explico bien, en la tabla ascii standar (la de toda la vida) para la E acentuada el carácter es 130 no 233, ¿Como puedo hacer que use la tabla "normal"

Como por ejemplo esta tabla http://www.elcodigoascii.com.ar/

__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #4  
Antiguo 23-09-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
Pregunto: ¿Las secuencias de carácteres del código anterior se representan correctamente en sus valores ordinales en tu sistema?.

Revisa este link:

Espero sea útil

Nelson.
Si según la tabla que tu muestras si, pero debe haber variaas tablas.
"There are several different variations of the 8-bit ASCII table. The table below is according to ISO 8859-1, also called ISO Latin-1. Codes 129-159 contain the Microsoft® Windows Latin-1 extended characters."

¿Como sabemos que tabla usar?
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #5  
Antiguo 23-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
cesarsoftware,

Cita:
Empezado por cesarsoftware
...por lo que dices en nuestra máquina/windows es así, pero no en el resto...

...según la tabla que tu muestras si, pero debe haber varias tablas...¿Como sabemos que tabla usar?...
Pregunto:

1- ¿En que versión de Delphi esta desarrollada tu aplicación?.

2- ¿Que versión de Windows y Configuración de System Locale utiliza la máquina que envía la secuencia?.

3- ¿Que versión de Windows y Configuración de System Locale utiliza la máquina que recibe la secuencia?.

Espero sea útil

Nelson.
Responder Con Cita
  #6  
Antiguo 23-09-2013
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 22
gatosoft Va camino a la fama
Creo, (y supongo que es evidente) que el problema se da por la transformación de un texto desde UTF8 a ASCII... estas transportando, cargando un texto que VES en ASCII pero que te ha sido entregado en otro formato... tu lo recibes en ASCII y lo tratas como ASCII... y todo tu codigo está pensado en ASCII...

A mi me sucedia algo parecido, al crear un documento de TEXTO en Notepad++... Cuando lo leia en Delphi con un TStringList me mostraba éstos carateres extraños...

Código Delphi [-]
Var Cadena:String;
MyStringList.LoadFromFile(NombreArchivo);
Cadena:= MyStringList.Text;

lo que sucedía era que el archivo se estaba guardando en UTF8.. para esto Delphi da una solución

Código Delphi [-]
Var Cadena:String;
MyStringList.LoadFromFile(NombreArchivo,TEncode.UTF8);
Cadena:= MyStringList.Text;

Y listo..!!

A pesar que las variables String aceptan por defecto (ahora) carcateres unicode, el TStringList le estaba enviando algo que creia era ASCII...

saludo,
Responder Con Cita
  #7  
Antiguo 24-09-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Cita:
Empezado por gatosoft Ver Mensaje
Creo, (y supongo que es evidente) que el problema se da por la transformación de un texto desde UTF8 a ASCII... estas transportando, cargando un texto que VES en ASCII pero que te ha sido entregado en otro formato... tu lo recibes en ASCII y lo tratas como ASCII... y todo tu codigo está pensado en ASCII...

A mi me sucedia algo parecido, al crear un documento de TEXTO en Notepad++... Cuando lo leia en Delphi con un TStringList me mostraba éstos carateres extraños...

Código Delphi [-]Var Cadena:String; MyStringList.LoadFromFile(NombreArchivo); Cadena:= MyStringList.Text;


lo que sucedía era que el archivo se estaba guardando en UTF8.. para esto Delphi da una solución

Código Delphi [-]Var Cadena:String; MyStringList.LoadFromFile(NombreArchivo,TEncode.UTF8); Cadena:= MyStringList.Text;


Y listo..!!

A pesar que las variables String aceptan por defecto (ahora) carcateres unicode, el TStringList le estaba enviando algo que creia era ASCII...

saludo,
Algo asi debe ser, pero .... este es el código de la función que uso (pero también está este problema EN TODO DELPHI 2010).
Por cierto, uso asnsistring porque cada caracter es de 8 bit, si uso string cada carácter es de 16 bit, que ya me las he tenido que ver con Delphi 2010 por este tema.
Código Delphi [-]
function ThreadReadServidor.Envia(cadena: ansistring): integer;
var
  size: word;
  Resultado, sendlen, slen: integer;
begin
  slen := Sizeof(remoto);
  Resultado := 0;
  size := Length(cadena);
  if size = 0 then
  begin
    Result := -6;
    Exit;
  end;
  if tipo = UDP then
    sendlen := SendTo(nSocket, cadena[1], size, 0, remoto, slen)
  else
    sendlen := Send(nSocket, cadena[1], size, 0);
  if (sendlen = SOCKET_ERROR) or (sendlen < size) then
  begin
    case WSAGetLastError of
      WSANOTINITIALISED: ErrorString := 'A successful WSAStartup call must occur before using this function.';
      WSAENETDOWN: ErrorString := 'The network subsystem has failed.';
      WSAEACCES: ErrorString := 'The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST socket option to enable use of the broadcast address.';
      WSAEINTR: ErrorString := 'A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.';
      WSAEINPROGRESS: ErrorString := 'A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.';
      WSAEFAULT: ErrorString := 'The buf parameter is not completely contained in a valid part of the user address space.';
      WSAENETRESET: ErrorString := 'The connection has been broken due to the keep-alive activity detecting a failure while the operation was in progress.';
      WSAENOBUFS: ErrorString := 'No buffer space is available.';
      WSAENOTCONN: ErrorString := 'The socket is not connected.';
      WSAENOTSOCK: ErrorString := 'The descriptor is not a socket.';
      WSAEOPNOTSUPP: ErrorString := 'MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.';
      WSAESHUTDOWN: ErrorString := 'The socket has been shut down; it is not possible to send on a socket after shutdown has been invoked with how set to SD_SEND or SD_BOTH.';
      WSAEWOULDBLOCK: ErrorString := 'The socket is marked as nonblocking and the requested operation would block.';
      WSAEMSGSIZE: ErrorString := 'The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.';
      WSAEHOSTUNREACH: ErrorString := 'The remote host cannot be reached from this host at this time.';
      WSAEINVAL: ErrorString := 'The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.';
      WSAECONNABORTED: ErrorString := 'The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no longer usable.';
      WSAECONNRESET: ErrorString := 'The virtual circuit was reset by the remote side executing a hard or abortive close. For UDP sockets, the remote host was unable to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet.';// The application should close the socket as it is no longer usable.';
      WSAETIMEDOUT: ErrorString := 'The connection has been dropped, because of a network failure or because the system on the other end went down without notice.';
    else
      ErrorString := 'Error Desconocido';
    end;
    Resultado := -7;
  end;
  Result := Resultado;
end;
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #8  
Antiguo 24-09-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
Pregunto:

1- ¿En que versión de Delphi esta desarrollada tu aplicación?.

2- ¿Que versión de Windows y Configuración de System Locale utiliza la máquina que envía la secuencia?.

3- ¿Que versión de Windows y Configuración de System Locale utiliza la máquina que recibe la secuencia?.
1. Delphi 2010
2. Windows 7 64 (España, Internacional)
3. Ni idea, puede ser cualquiera, incluso linux, el cliente remoto es eso, un cliente remoto, yo creo un servidor TCP y a mi aplicación se le hacen consultas, por ejemplo (Lista de usuarios, Nombres de máquinas, estado de máquina tal o cual, etc) por eso, la mayoria (o todos) esperan una secuencia ASCII
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.

Última edición por cesarsoftware fecha: 24-09-2013 a las 11:15:46.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
insert ansistring? noelr Conexión con bases de datos 0 23-11-2011 02:00:59
Uso de AnsiString 11_8_88 C++ Builder 8 14-08-2010 20:53:47
Generar un string con codigos ascii JordiP Varios 9 16-12-2009 11:39:16
string o AnsiString? javier20 OOP 1 19-08-2007 01:58:35
AnsiString en una Dll Trigger API de Windows 2 21-01-2004 22:53:20


La franja horaria es GMT +2. Ahora son las 14:18:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi