2012-09-12 65 views
0

OS:匈牙利的Windows(視窗1250)如何測試我的WideReplace功能?

在德爾福6教授沒有WideStringPos, WideStringCopy, WideStringReplace ...

但是在一個基於XML的項目,我需要使用它們。

因爲我試圖寫「類似」這些功能。

但我不知道他們的工作,因爲我想...

因爲德爾福轉換寬爲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. 你知道一些我可以測試這個代碼的人嗎?

例如,CHR(XXX),當我轉換器保持寬規則,但失去,如果我做了錯誤的代碼是什麼剩餘...

感謝每一個信息,你會寫...

+4

嘗試查找TNT控件。他們已經完成了所有這些工作。從'TntWideStrUtils.pas'找到'WStrPos','WStrCopy'函數和從'TntSysUtils.pas'找到'WideStringReplace'。 – TLama

+3

我沒有看到'WideStringCopy';內置的'Copy'命令已經做了同樣的事情(但是*沒有*做所有中間字符串的不必要的副本)。 –

+0

Jedi CodeLibrary現在是D6兼容的,擁有很多WideString函數,並且還有一個XMl解析器。坦率地說,爲什麼重新發明自行車,而不是採取已經測試的代碼? –

回答

0

你知道一些字符嗎我可以測試這段代碼嗎?

任何代碼頁超越WIN1250 - 例如西里爾Win1251,希臘語,希伯來語 - 幾乎所有的信件將有來自1252分之1250

錯過你可以把絕地CodeLibrary並使用其語言環境的轉換例程:做一個串包括#128到#255的一些編碼,如上所述,將其從該代碼頁轉換爲Unicode,然後從Unicode轉換回匈牙利代碼頁。

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

或者在一個呼叫

功能TranslateString(常量S:AnsiString類型; CP1,CP2:字):AnsiString類型;

然後看看哪些字符未能翻譯並轉換爲ReplacementCharacter。


但是,在JCL中,您將擁有Pos功能,並且可以隨時使用。和XML解析器。那爲什麼要麻煩?