使用Inno Setup(Unicode版本)创建不带BOM的UTF8文件 [英] Create a UTF8 file without BOM with Inno Setup (Unicode version)
问题描述
我必须阅读和修改一些JSON文件.文件编码必须为UTF8(不带BOM),否则将不接受JSON文件.
I have to read and modify some JSON files. The file encoding must be UTF8 without BOM or the JSON file will be not accepted.
我尝试了以下代码:
const
Utf8Bom = #$EF#$BB#$BF;
Utf16BomLE = #$FF#$FE; // little endian //
Utf16BomBE = #$FE#$FF; // big endian //
Utf16Bom = Utf16BomBE;
CP_UTF16 = 1200;
CP_UTF8 = 65001;
function WideStringToString (const wStr: string; codePage: Word): string;
var
len: Integer;
begin
len := WideCharToMultiByte (codePage, 0, wStr, -1, '', 0, 0, 0);
if len > 0 then
begin
SetLength (Result, len-1);
WideCharToMultiByte (codePage, 0, wStr, -1, Result, Length (Result), 0, 0);
end;
end;
function ClearBom(const s, sig: string): string;
var
i, n, len: Integer;
begin
Result := s;
len := Length (sig);
n := 0;
if (len> 0) and (Length (Result)> len) then
repeat
for i := 1 to len do
if Result [1] = sig [i] then
begin
Delete (Result, 1, 1);
Break;
end;
n := n + 1;
until (n = len) or (Result = '');
end;
function ConvertUtf16(const SourceStr: string; codePage: Word): string;
var
wStr: string;
begin
try
wStr := ClearBom(SourceStr, Utf16Bom);
Result := WideStringToString(wStr, codePage);
finally
SetLength(wStr, 0);
end;
end;
function Utf16ToUtf8(const SourceStr: string): string;
begin
Result := ConvertUtf16(SourceStr, CP_UTF8);
end;
function JSONSaveFile(const Filename: String; s: String): Boolean;
var
fs: TFileStream;
i, len : Integer;
begin
i := 1;
len := Length(s)
If len > 0 then
begin
try
try
fs := TFileStream.Create(Filename, fmCreate or f mShareExclusive);
fs.Seek(0, 0);
while (s[i] <> #0) and (i < len) do
begin
fs.WriteBuffer(s[i],CharLength(s,i));
i := i + CharLength(s,i);
end;
Result := True;
except
Log('EXCEPTION RAISED in JSONSaveFile: '+Filename);
end;
finally
fs.free;
end;
end;
end;
我只得到ANSI编码的文件.像SaveStringsToUTF8File()
函数这样的内置函数将不起作用,因为默认情况下会添加BOM.
I get only a ANSI coded files. Build-in functions like SaveStringsToUTF8File()
function will not work, cause the BOM is added by default.
还是用SaveStringToFile()
保存/创建此文本文件的更好方法?
Or is the a better way to save/create this text file with SaveStringToFile()
?
如何解决?
推荐答案
Use the WideCharToMultiByte
function to convert the string to UTF-8 and just save it:
const
CP_UTF8 = 65001;
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD;
lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString;
cchMultiByte: Integer; lpDefaultCharFake: Integer;
lpUsedDefaultCharFake: Integer): Integer;
external 'WideCharToMultiByte@kernel32.dll stdcall';
function GetStringAsUtf8(S: string): AnsiString;
var
Len: Integer;
begin
Len := WideCharToMultiByte(CP_UTF8, 0, S, Length(S), Result, 0, 0, 0);
SetLength(Result, Len);
WideCharToMultiByte(CP_UTF8, 0, S, Length(S), Result, Len, 0, 0);
end;
function SaveStringToUTF8FileWithoutBOM(FileName: string; S: string): Boolean;
var
Utf8: AnsiString;
begin
Utf8 := GetStringAsUtf8(S);
Result := SaveStringToFile(FileName, Utf8, False);
end;
您必须使用 Unicode版本的Inno Setup (Inno Setup 6唯一的版本).
You have to use Unicode version of Inno Setup (the only version as of Inno Setup 6).
另请参阅:
-
LoadStringFromFileInCP
和LoadStringsFromFileInCP
在以下功能中起作用:
Inno设置-将字符串数组转换为Unicode并转换回ANSI - Inno Setup替换了没有BOM的UTF-8文件中的字符串
LoadStringFromFileInCP
andLoadStringsFromFileInCP
functions in:
Inno Setup - Convert array of string to Unicode and back to ANSI- Inno Setup replace a string in a UTF-8 file without BOM
这篇关于使用Inno Setup(Unicode版本)创建不带BOM的UTF8文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!