如何测试我的WideReplace功能?

时间:2012-09-12 12:46:08

标签: delphi function unicode character widestring

操作系统:匈牙利Windows(Windows 1250)

在Delphi 6教授的指导下,没有WideStringPos, WideStringCopy, WideStringReplace ...

但是在基于XML的项目中,我需要使用它们。

因为我试图写出“类似”这些功能。

但我不确定他们是否正如我所愿......

因为Delphi将Wide转换为Ansi并在后台反转,我无法确定我的代码是否可以避免这些副作用......: - )

代码非常原始 - 我需要快速解决方案......

 function WideStringCopy(WWhat : WideString; From, HowMany : integer) : WideString;
 var
     i : integer;
     l : integer;
     wc : WideChar;
 begin
     Result := '';

     if WWhat = ''
         then Exit;

     if (HowMany <= 0)
         then Exit;

     if  (From < 1)
         then From := 1;

     l := From + HowMany - 1;
     if l > Length(WWhat)
         then l := Length(WWhat);

     for i := From to l do begin
         wc := WWhat[i];
         Result := Result + wc;
     end;
 end;

 function WideStringPos(WWhere, WWhat : WideString) : integer;
 var
     wscomp : WideString;
     i : integer;
 begin
     Result := 0;
     for i := 1 to Length(WWhere) do begin
         wscomp := WideStringCopy(WWhere, i, LengtH(WWhat));
         if WideSameStr(wscomp, WWhat)
             then begin
                 Result := i;
                 Exit;
             end;
     end;
 end;

 function WideStringReplace(WWhere, WFrom, WTo : WideString) : WideString;
 var
     actpos : integer;
     wcomp : WideString;
     wc : WideChar;
 begin
     Result := '';
     actpos := 1;
     while actpos <= Length(WWhere) do begin
         wcomp := WideStringCopy(WWhere, actpos, Length(WFrom));
         if WideSameStr(wcomp, WFrom) then begin

             Result := Result + WTo;
             inc(actpos, Length(WFrom));

         end else begin

             wc := WWhere[actpos];
             Result := Result + wc;
             inc(actpos);

         end;
     end;
 end;

我有两个问题:

  1. 您是否看到任何代码肯定会产生不良结果(将Wide转换为Ansi并导致角色丢失)?

  2. 你知道我可以测试这段代码吗?

  3. 例如,chr(XXX)当我的转换器保持宽规则时剩余的是什么,但如果我制作错误的代码则会丢失......

    感谢您撰写的所有信息......

1 个答案:

答案 0 :(得分:0)

  

你知道一些角色我可以测试这段代码吗?

Win1250以外的任何代码页 - 例如Cyrillic Win1251,希腊语,希伯来语 - 几乎所有字母都会在1250/1252之间遗漏

您可以使用Jedi CodeLibrary并使用其语言环境转换例程:在上述某些编码中创建一个由#128到#255组成的字符串,从该代码页转换为Unicode,然后从Unicode转换回匈牙利代码页。

function StringToWideStringEx(const S:AnsiString; CodePage:Word):WideString; function WideStringToStringEx(const WS:WideString; CodePage:Word):AnsiString;

或在一个电话中

function TranslateString(const S:AnsiString; CP1,CP2:Word):AnsiString;

然后查看哪些字符未能翻译并转换为ReplacementCharacter。


但是在JCL中,你有Pos功能,可以随时使用。和XML解析器。那么为什么要这么麻烦呢?