es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo guardar un JSONObject en un archivo json con codificación UTF8 en Rad Studio/Delphi.

Uso Rad Studio 11. Leo información de un archivo json (el archivo está codificado en UTF8) y lo convierto en un objeto json.
Luego hago cambios en este objeto json y quiero guardarlo en un archivo json. La información se escribe correctamente en el archivo, pero el archivo tiene la codificación Windows-1251. ¿Qué se debe hacer para que la codificación del archivo sea UTF8? Esto me es necesario porque el archivo json incluye símbolos rusos (en la codificación Windows-1251 se ven como ‘?’).

Leo desde un archivo de la siguiente manera:

var inputfile: TextFile;
str: string;
...
if OpenDialog1.Execute then begin
  AssignFile(inputfile, OpenDialog1.FileName);
  reset(inputfile);

while not Eof(inputfile) do
begin
ReadLn(inputfile, str);
str1 := str1+UTF8ToANSI(str);
end;

closefile(inputfile);
end;

Convierto a JsonObject de la siguiente manera:
LJsonObj := TJSONObject.ParseJSONValue(str1) as TJSONObject;

Intento guardar JsonObject de la siguiente manera:

var
  listStr: TStringList;
  Size: Integer;
  I: Integer;
...
Size := Form3.LJsonObj.Count;
liststr := TStringList.Create;

try
    listStr.Add('{');

if Size > 0 then
  listStr.Add(LJsonObj.Get(0).ToString);

showmessage(LJsonObj.Get(0).ToString);

for I := 1 to Size - 1 do
begin
  listStr.Add(',');
  listStr.Add(ANSITOUTF8(LJsonObj.Get(I).ToString));
end;

listStr.Add('}');
// Form1.filepath- es la ruta del archivo,form1.filename- el nombre del archivo sin la extensión del archivo 
listStr.SaveToFile(Form1.filepath+'\' + form1.filename + '.json');

finalmente
listStr.Free;
end;

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que el archivo guardado tenga codificación UTF8, es necesario utilizar el método SaveToStream de TStringList con un flujo de texto codificado en UTF8. Aquí está el código actualizado que puedes usar para guardar el JsonObject en un archivo codificado en UTF8:

    var   
      listStr: TStringList;
      Size: Integer;
      I: Integer;
      utf8Stream: TStream;
    
    ...
    
      Size := Form3.LJsonObj.Count;
      listStr := TStringList.Create;
    
      try
        listStr.Add('{');
    
        if Size > 0 then
          listStr.Add(LJsonObj.Get(0).ToString);
    
        ShowMessage(LJsonObj.Get(0).ToString);
    
        for I := 1 to Size - 1 do
        begin
          listStr.Add(',');
          listStr.Add(LJsonObj.Get(I).ToString);
        end;
    
        listStr.Add('}');
    
        // Crear un flujo codificado en UTF8
        utf8Stream := TStringStream.Create('', TEncoding.UTF8);
        try
          // Guardar el texto codificado en UTF8 en el flujo
          listStr.SaveToStream(utf8Stream);
          // Guardar el flujo en el archivo
          TFile.WriteAllBytes(Form1.filepath+'\' + form1.filename + '.json', utf8Stream.Bytes);
        finally
          utf8Stream.Free;
        end;
      finally
        listStr.Free;
      end;
    

    Este código crea un objeto TStringStream inicializado con una cadena vacía y una codificación UTF8. Después de guardar listStr en el flujo, guarda el flujo en el archivo utilizando TFile.WriteAllBytes con la ruta y nombre del archivo. Esto debería asegurar que el archivo guardado tenga codificación UTF8 y que tus símbolos rusos se muestren correctamente.

Comments are closed.