Comment enregistrer un UTF-16 avec un fichier BOM avec Inno Setup

Nov 29 2020

Comment enregistrer une chaîne dans un fichier texte avec encodage UTF-16 (UCS-2) avec BOM?

Les SaveStringsToUTF8Filesauvegardes au format UTF-8.

L'utilisation de flux l'enregistre au format ANSI.

var
  i:integer;
begin
  for i := 1 to length(aString) do begin
    Stream.write(aString[i],1);
    Stream.write(#0,1);
  end;
  stream.free;
end;

Réponses

2 MartinPrikryl Nov 30 2020 at 15:12

Comme l'Unicode string(dans la version Unicode d'Inno Setup - la seule version d'Inno Setup 6) utilise en fait l'encodage UTF-16 LE, il vous suffit de copier le (Unicode) stringdans un tableau d'octets ( AnsiString) bit- sage. Et ajoutez la nomenclature UTF-16 LE ( FEFF):

procedure RtlMoveMemoryFromStringToPtr(Dest: PAnsiChar; Source: string; Len: Integer);
  external '[email protected] stdcall';
  
function SaveStringToUFT16LEFile(FileName: string; S: string): Boolean;
var
  A: AnsiString;
begin
  S := #$FEFF + S; 
  SetLength(A, Length(S) * 2);
  RtlMoveMemoryFromStringToPtr(A, S, Length(S) * 2);
  Result := SaveStringToFile(FileName, A, False);
end;

C'est juste l'opposé de: Inno Setup Pascal Script - Lecture du fichier UTF-16 .