Delphi 如何添加';文件中键和值的字符

Delphi 如何添加';文件中键和值的字符,delphi,ini,Delphi,Ini,我正在使用delphixe3。我使用ini文件写入.ini文件。问题之一是当我使用WriteString()将字符串写入ini文件时。尽管原始字符串包含”,但ini文件将在写入ini文件后将其删除。更糟糕的是,字符串同时包含“和” 见下文: 程序TForm1.按钮4点击(发送方:TObject); 变量 Str,Str1:字符串; IniFile:TIniFile; 开始 IniFile:=TIniFile.Create('E:\Temp\Test.ini'); Str:='”这是一个“测试”值

我正在使用delphixe3。我使用
ini文件
写入
.ini
文件。问题之一是当我使用
WriteString()
将字符串写入ini文件时。尽管原始字符串包含
,但
ini文件
将在写入ini文件后将其删除。更糟糕的是,字符串同时包含

见下文:

程序TForm1.按钮4点击(发送方:TObject);
变量
Str,Str1:字符串;
IniFile:TIniFile;
开始
IniFile:=TIniFile.Create('E:\Temp\Test.ini');
Str:='”这是一个“测试”值“;
WriteString('Test','Key',Str);
Str1:=IniFile.ReadString('Test','Key','';
如果Str Str1那么
Application.MessageBox('不同的值','错误');
免费;
终止
是否有办法确保
文件
将在值周围写入

更新

我尝试在ini文件中转义并取消转义引号“,以及=,如下所示:

function EscapeQuotes(const S: String) : String;
begin
    Result := StringReplace(S, '\', '\\', [rfReplaceAll]);
    Result := StringReplace(Result, '"', '\"', [rfReplaceAll]);
    Result := StringReplace(Result, '=', '\=', [rfReplaceAll]);
end;

function UnEscapeQuotes(const S: String) : String;
var
    I : Integer;
begin
    Result := '';
    I := 1;
    while I <= Length(S) do begin
        if (S[I] <> '\') or (I = Length(S)) then
            Result := Result + S[I]
        else begin
            Inc(I);
            case S[I] of
            '"': Result := Result + '"';
            '=': Result := Result + '=';
            '\': Result := Result + '\';
            else Result := Result + '\' + S[I];
            end;
        end;
        Inc(I);
    end;
end;
函数转义符(const S:String):String;
开始
结果:=StringReplace(S,'\','\\',[rfReplaceAll]);
结果:=StringReplace(结果“,”\“,[rfReplaceAll]);
结果:=StringReplace(结果“=”,“\=”,[rfReplaceAll]);
终止
函数UnEscapeQuotes(const S:String):String;
变量
I:整数;
开始
结果:='';
I:=1;

而I则不能在INI文件中写入任何内容。但您可以转义Windows不允许或不以特殊方式处理的任何字符

下面的简单代码实现了一个基本的转义机制(可以优化):

函数转义符(const S:String):String;
开始
结果:=StringReplace(S,'\','\\',[rfReplaceAll]);
结果:=StringReplace(结果“,”\“,[rfReplaceAll]);
终止
函数UnEscapeQuotes(const S:String):String;
变量
I:整数;
开始
结果:='';
I:=1;

而I则不能在INI文件中写入任何内容。但您可以转义Windows不允许或不以特殊方式处理的任何字符

下面的简单代码实现了一个基本的转义机制(可以优化):

函数转义符(const S:String):String;
开始
结果:=StringReplace(S,'\','\\',[rfReplaceAll]);
结果:=StringReplace(结果“,”\“,[rfReplaceAll]);
终止
函数UnEscapeQuotes(const S:String):String;
变量
I:整数;
开始
结果:='';
I:=1;

虽然我知道你的代码没有使用
。你确定写作是个问题吗?当值“被单引号或双引号括起来,标记被丢弃”时,读取应该是问题所在,嗯?尝试使用
TMemIniFile
。它解决了
TIniFile
@RemyLebeau的各种缺点,抱歉,我尝试了TMemIniFile,但它无法解决我的问题。
Str:='“这是一个“测试”值”是无效字符串,因为它是不正确的标点符号。它包含两个字符串(
“这是一个”
“值”
),孤立词
test
出现在引号外。引号的规则是,如果短语位于两个双引号之间,则嵌入的引号应为单引号(例如,“这是一个‘测试’值”),如果外部引号为单引号,则内部引号应为双引号(例如,
“这是一个‘测试’值’
)。您的代码不使用
。你确定写作是个问题吗?当值“被单引号或双引号括起来,标记被丢弃”时,读取应该是问题所在,嗯?尝试使用
TMemIniFile
。它解决了
TIniFile
@RemyLebeau的各种缺点,抱歉,我尝试了TMemIniFile,但它无法解决我的问题。
Str:='“这是一个“测试”值”是无效字符串,因为它是不正确的标点符号。它包含两个字符串(
“这是一个”
“值”
),孤立词
test
出现在引号外。引号的规则是,如果短语位于两个双引号之间,则嵌入的引号应为单引号(例如,“这是一个‘测试’值”),如果外部引号为单引号,则内部引号应为双引号(例如,
‘这是一个‘测试’值’
)。很抱歉,您的代码对“=”equal不起作用。@alancc然后请更新您的问题,以包含一个
=
不起作用的示例。@alancc很抱歉,但它对equal sin也起作用。我用Str:='测试了代码,这是对key=value的“测试”;在哪里插入等号?举个例子,用所有不起作用的情况更新你的问题。非常感谢。最后,我使用您的解决方案,带有一个变体。我使用\x3D来转义等号,因此转义字符串中不再出现等号。很抱歉,您的代码对“=”equal不起作用。@alancc然后请更新您的问题,以包含一个
=
不起作用的示例。@alancc很抱歉,但它对等号sin也起作用。我用Str:='测试了代码,这是对key=value的“测试”;在哪里插入等号?举个例子,用所有不起作用的情况更新你的问题。非常感谢。最后,我使用您的解决方案,带有一个变体。我使用\x3D转义等号,因此转义字符串中不再出现等号。
function EscapeQuotes(const S: String) : String;
begin
    Result := StringReplace(S, '\', '\\', [rfReplaceAll]);
    Result := StringReplace(Result, '"', '\"', [rfReplaceAll]);
end;

function UnEscapeQuotes(const S: String) : String;
var
    I : Integer;
begin
    Result := '';
    I := 1;
    while I <= Length(S) do begin
        if (S[I] <> '\') or (I = Length(S)) then
            Result := Result + S[I]
        else begin
            Inc(I);
            case S[I] of
            '"': Result := Result + '"';
            '\': Result := Result + '\';
            else Result := Result + '\' + S[I];
            end;
        end;
        Inc(I);
    end;
end;
procedure Form1.Button4Click(Sender: TObject);
var
  Str, Str1: string;
  IniFile: TIniFile;
begin

  IniFile := TIniFile.Create('E:\Temp\Test.ini');
  try

    Str := '"This is a "test" for key=value"';
    IniFile.WriteString('Test', 'Key', EscapeQuotes(Str));
    Str1 := UnEscapeQuotes(IniFile.ReadString('Test', 'Key', ''));

    if Str <> Str1 then
      Application.MessageBox('Different value', 'Error');

  finally
    IniFile.Free;
  end;

end;