Ver Mensaje Individual
  #4  
Antiguo Hace 2 Semanas
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Reputación: 2
navbuoy Va por buen camino
Para recibir y mostrar correctamente texto codificado en UTF-8 en Delphi (especialmente versiones como Delphi 7 que no tienen soporte nativo de UTF-8 en los AnsiString), necesitas realizar algunas conversiones manuales o usar componentes que manejen UTF-8 adecuadamente.

✅ Delphi moderno (Delphi XE en adelante)
Si estás usando una versión moderna de Delphi (Delphi XE+), puedes trabajar directamente con UTF8String y UnicodeString, ya que la clase String es UnicodeString por defecto.

Código Delphi [-]
uses
  System.SysUtils;

var
  utf8Texto: UTF8String;
  textoFinal: string;
begin
  utf8Texto := '{"mensaje":"¡Bienvenido a México!"}';
  textoFinal := UTF8ToString(utf8Texto); // Convierte de UTF-8 a Unicode (string)
  ShowMessage(textoFinal);
end;


🧵 Delphi 7 o versiones antiguas (AnsiString por defecto)
Delphi 7 no trabaja de forma nativa con UTF-8, pero puedes usar una función como esta para convertir una cadena en UTF-8 a WideString o string legible:

✅ Opción 1: Usar UTF8Decode (de SysUtils)

Código Delphi [-]
uses
  SysUtils;

var
  utf8Cadena: string;
  textoDecodificado: string;
begin
  utf8Cadena := '{"mensaje":"¡Bienvenido a M\u00e9xico!"}';
  textoDecodificado := UTF8Decode(utf8Cadena); // Solo si la cadena está en UTF-8 puro
  ShowMessage(textoDecodificado);
end;

🔴 Nota importante: UTF8Decode solo convierte UTF-8 en bytes, no convierte automáticamente los \uXXXX (Unicode escapes como \u00e9), esos debes convertirlos manualmente si vienen así (como en JSON).

✅ Para reemplazar \uXXXX por caracteres reales (por ejemplo, en respuestas JSON)
Puedes usar una función como esta para convertir los \uXXXX en caracteres legibles:

Código Delphi [-]
function UnicodeDecode(const S: string): string;
var
  I: Integer;
  Code: Integer;
  HexStr: string;
begin
  Result := '';
  I := 1;
  while I <= Length(S) do
  begin
    if (S[i] = '\') and (I + 5 <= Length(S)) and (S[I+1] = 'u') then
    begin
      HexStr := Copy(S, I + 2, 4);
      if TryStrToInt('$' + HexStr, Code) then
      begin
        Result := Result + WideChar(Code);
        Inc(I, 6);
        Continue;
      end;
    end;
    Result := Result + S[i];
    Inc(I);
  end;
end;

EJEMPLO DE USO:

Código Delphi [-]
var
  respuesta: string;
begin
  respuesta := '{"mensaje":"Bienvenido a M\u00e9xico"}';
  respuesta := UnicodeDecode(respuesta); // Convierte los \u00e9 en é
  ShowMessage(respuesta);
end;


🔧 Si estás trabajando con HTTP (como REST/JSON):
Asegúrate de que el componente (como IdHTTP, Synapse, HttpClient) esté configurado para recibir texto como UTF-8:

Código Delphi [-]
IdHTTP1.Request.ContentType := 'application/json; charset=utf-8';
IdHTTP1.Request.AcceptCharSet := 'utf-8';

Luego haz la conversión adecuada al recibir la respuesta.
Responder Con Cita