function TForm1.unlegalXMLcharactor(const s: WideChar):Boolean;     //非法字符
begin
  Result := False;
  if not((s = #$9) or (s = #$A)
                or (s = #$D)
                or ((s > #$1F) and (s < #$D800))
                or ((s > #$DFFF) and (s < #$FFFE))
                or ((s > #$FFFF) and (s <= #$10FFFF)))  then Result :=True ;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
  savems: TMemoryStream;
  current: WideChar;
  change: Boolean;
  memint: integer;
  pc,ps: PChar;
begin
  change := False;
  memint :=0;
  if OpenDialog1.Execute then
  begin
    ms := TMemoryStream.Create;                             //输入流
    savems := TMemoryStream.Create;                         //输出流
    ms.LoadFromFile(OpenDialog1.FileName);
    savems.SetSize(ms.Size);                                //初始化输出流长度
    pc := ms.Memory;
    ps := savems.Memory;
    ms.Position :=0;
    savems.Position :=0;

解决方案 »

  1.   

        while ms.Position < ms.Size do
        begin
          ms.Read(current,2);                                   //宽字符读取
    //      ShowMessage(current);      if unlegalXMLcharactor(current) then
            begin
              if  change = False then
                begin
                  if (MessageDlg('文件中有非法字符,是否需求转换?',mtWarning,mbOKCancel,0)= mrOk) then change := True
                end;
     //           ShowMessage(IntToStr(ms.Position));
              Continue;
            end
          else
          begin
              ps[memint] := pc[ms.position-2];
              ps[memint+1] := pc[ms.position-1];
              memint := memint +2;
          end;
        end;
        savems.SetSize(memint);
     //   ShowMessage(IntToStr(ms.Position));
        if change = True then
        begin
          savedialog1.filename := OpenDialog1.FileName;
          SaveDialog1.InitialDir := ExtractFilePath(ParamStr(0));
          if SaveDialog1.Execute then
          begin
            if extractfileExt(savedialog1.FileName)<>'.nqd' then
                SaveDialog1.FileName := ChangeFileExt(SaveDialog1.FileName,'.nqd');
            savems.SaveToFile(SaveDialog1.FileName);
          end;
        end;
        change := False;
        savems.Free;
        ms.Free;
      end;
    end;
    end.
    当运行时,总是在半路出现runtime error at 216 错误,确实不知道哪里出现了问题,寻求帮助(DELPHI2009),但是在delphi7下完全正常