如何将 ' 字符添加到 TIniFile 中的键和值



我使用的是Delphi XE3。我使用TIniFile写入.ini文件。其中一个问题是,当我使用WriteString()写一个字符串到ini文件。虽然原始字符串包含',但TIniFile将在写入ini文件后将其删除。更糟糕的是,当字符串同时包含'"时。

见下文:

procedure TForm1.Button4Click(Sender: TObject);
var
  Str, Str1: string;
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create('E:TempTest.ini');
  Str := '"This is a "test" value"';
  IniFile.WriteString('Test', 'Key', Str);
  Str1 := IniFile.ReadString('Test', 'Key', '');
  if Str <> Str1 then
    Application.MessageBox('Different value', 'Error');
  IniFile.Free;
end;

是否有办法确保TIniFile将写'周围的值?

我尝试转义和反转义引号",以及我的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;

但是对于下面的行:

'This is a = Test'='My Tset'

ReadString将只读取'This is a ='作为键,而不是'This is a = Test'

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

下面的简单代码实现了基本的转义机制(可以优化):
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:TempTest.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;

当然,您也可以转义其他字符,例如CR和LF这样的控制字符。你已经明白了:-)

相关内容

  • 没有找到相关文章

最新更新