因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用。
后面发现多次使用后delphi自带的HttpEncode会报Out of Memory.
以上可能是我使用的不好,但没有找到解决办法。
后面想到直接采用运行JavaScript代码,找到了”万一的 Delphi 博客“
在 Delphi 中调用 JavaScript(2) - 万一 - 博客园 (cnblogs.com)
{此函数需要 ComObj 单元的支持} {参数 JsCode 是要执行的 Js 代码; 参数 JsVar 是要返回的变量} function RunJs(const JsCode, JsVar: string): string; varscript: OleVariant; begin tryscript := CreateOleObject('ScriptControl'); script.Language := 'JavaScript'; script.ExecuteStatement(JsCode); Result :=script.Eval(JsVar); exceptResult := ''; end; end;
万一老师的博客,内容简洁,附完全代码(pas和dfm),赞一个!
这个函数非常好用,但有一个问题,每次执行的时间较长。
经过研究,是创建时间较长。 所以可以分为2个函数,创建和执行。
开始时一次创建,需要时多次执行
完全代码如下:
unitUnit1; interface usesComObj, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; typeTForm1 = class(TForm) Button1: TButton; procedureButton1Click(Sender: TObject); private {Private declarations } public {Public declarations } end; varForm1: TForm1; script: OleVariant; implementation {$R *.dfm} function RunJs(const JsCode, JsVar: string): string; begin tryscript.ExecuteStatement(JsCode); Result :=script.Eval(JsVar); exceptResult := ''; end; end; procedurePrepareJs; begin tryscript := CreateOleObject('ScriptControl'); script.Language := 'JavaScript'; except end; end; procedureTForm1.Button1Click(Sender: TObject); varI,T : Integer; S : String; beginT :=GetTickCount; PrepareJs; for I:=0 to 9999 do beginS := RunJS('var a=encodeURIComponent("abc中文件123")','a') end; ShowMessage((GetTickCount-T).ToString+'- '+S); end; end.
经测试,执行10000次仅需要688毫秒