InnoSetupでBOMファイルを使用してUTF-16を保存する方法

Nov 29 2020

BOMでUTF-16(UCS-2)エンコーディングを使用して文字列をテキストファイルに保存するにはどうすればよいですか?

SaveStringsToUTF8FileUTF-8として保存されます。

ストリームを使用すると、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;

回答

2 MartinPrikryl Nov 30 2020 at 15:12

Unicode string(Inno SetupのUnicodeバージョン– Inno Setup 6の時点で唯一のバージョン)は実際にはUTF-16 LEエンコーディングを使用しているため、必要なのは(Unicode)stringをバイト配列(AnsiString)ビットにコピーすることだけです-賢い。そして、UTF-16 LE BOM(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;

これは正反対です:Inno Setup PascalScript-UTF-16ファイルの読み取り。