Utf 8 使用Inno设置(Unicode版本)创建不带BOM表的UTF8文件

Utf 8 使用Inno设置(Unicode版本)创建不带BOM表的UTF8文件,utf-8,text-files,inno-setup,Utf 8,Text Files,Inno Setup,我必须阅读和修改一些JSON文件。文件编码必须为不带BOM的UTF8,否则将不接受JSON文件 我尝试了以下代码: const Utf8Bom=#$EF#$BB#$BF; Utf16BomLE=#$FF#$FE;//小端 Utf16BomBE=#$FE#$FF;//大端 Utf16Bom=Utf16BomBE; CP_UTF16=1200; CP_UTF8=65001; 函数WideStringToString(constwstr:string;代码页:Word):string; 变量 len:

我必须阅读和修改一些JSON文件。文件编码必须为不带BOM的UTF8,否则将不接受JSON文件

我尝试了以下代码:

const
Utf8Bom=#$EF#$BB#$BF;
Utf16BomLE=#$FF#$FE;//小端
Utf16BomBE=#$FE#$FF;//大端
Utf16Bom=Utf16BomBE;
CP_UTF16=1200;
CP_UTF8=65001;
函数WideStringToString(constwstr:string;代码页:Word):string;
变量
len:整数;
开始
len:=宽图表多字节(代码页,0,wStr,-1',0,0,0);
如果len>0,则
开始
设置长度(结果,len-1);
宽图表多字节(代码页,0,wStr,-1,结果,长度(结果),0,0);
结束;
结束;
函数ClearBom(const s,sig:string):string;
变量
i、 n,len:整数;
开始
结果:=s;
len:=长度(sig);
n:=0;
如果(len>0)和(Length(Result)>len),则
重复
对于i:=1到len do
如果结果[1]=sig[i],则
开始
删除(结果,1,1);
打破
结束;
n:=n+1;
直到(n=len)或(结果=“”);
结束;
函数ConvertUtf16(constsourcestr:string;代码页:Word):string;
变量
wStr:字符串;
开始
尝试
wStr:=ClearBom(SourceStr,Utf16Bom);
结果:=WideStringToString(wStr,代码页);
最后
设置长度(wStr,0);
结束;
结束;
函数utf16tof8(const SourceStr:string):string;
开始
结果:=ConvertUtf16(SourceStr,cputf8);
结束;
函数JSONSaveFile(const Filename:String;s:String):布尔;
变量
fs:TFileStream;
i、 len:整数;
开始
i:=1;
长度:=长度(s)
如果len>0,则
开始
尝试
尝试
fs:=TFileStream.Create(文件名、fmCreate或f mshareeexclusive);
fs.Seek(0,0);
而(s[i]#0)和(i
我只得到一个ANSI编码的文件。内置函数,如
SaveStringsToUTF8File()
函数将不起作用,因为默认情况下会添加BOM表

还是使用
SaveStringToFile()
保存/创建此文本文件的更好方法

如何解决此问题?

使用将字符串转换为UTF-8并保存:

const
CP_UTF8=65001;
函数宽图表多字节(代码页:UINT;dwFlags:DWORD;
lpWideCharStr:string;cchWideChar:Integer;lpMultiByteStr:AnsiString;
cchMultiByte:整数;lpDefaultCharFake:整数;
lpUsedDefaultCharFake:Integer):整数;
外部的WideCharToMultiByte@kernel32.dllstdcall';
函数GetStringAsUtf8(S:string):AnsiString;
变量
Len:整数;
开始
Len:=宽图表多字节(CP_UTF8,0,S,长度,结果,0,0,0);
设置长度(结果,Len);
宽图表多字节(CP_UTF8,0,S,长度,结果,Len,0,0);
结束;
函数SaveStringToUTF8FileWithoutBOM(文件名:string;S:string):布尔;
变量
Utf8:AnsiString;
开始
Utf8:=GetStringAsUtf8(S);
结果:=SaveStringToFile(文件名,Utf8,False);
结束;
您必须使用(Inno Setup 6的唯一版本)


另见:

  • LoadStringFromFileInCP
    LoadStringsFromFileInCP
    函数位于:

是否使用Unicode Inno设置?是。编辑标题。thxi现在注意到,我没有将函数的代码
WideCharToMultiByte
复制到我的问题代码部分。我用PAnsiChar代替了“String”和“AnsiString”,因此它无法工作。明天我会检查完整的新功能,所以我会在那之后报告。非常感谢您的帮助。@Martin Prikryl“创建”一个新文件非常有效,但如果我只想更改文件中的一行,我该怎么办?@a请注意,关于这个主题已经有很多问题了:+++-如果没有帮助,请问一个新问题,但请确保您解释得很好,您的问题与现有问题有何不同。@MartinPrikryl感谢您的建议和参考。我刚刚找到了一个有用的解决方案。我的问题是我想替换文件中的一些字符串,但是
SaveStringToFile
方法将在标题中附加BOM,这使得文件不可用。这样就完美地解决了我的问题(现在)。非常感谢您的帮助和建议!