操作系统:匈牙利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;
我有两个问题:
您是否看到任何代码肯定会产生不良结果(将Wide转换为Ansi并导致角色丢失)?
你知道我可以测试这段代码吗?
例如,chr(XXX)当我的转换器保持宽规则时剩余的是什么,但如果我制作错误的代码则会丢失......
感谢您撰写的所有信息......
答案 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解析器。那么为什么要这么麻烦呢?