虽然有人回答了, 但这个问题还没有解决!!!!(需要高手来帮忙!!) (100分)

  • 主题发起人 主题发起人 tulpar
  • 开始时间 开始时间
T

tulpar

Unregistered / Unconfirmed
GUEST, unregistred user!
form 上 有一个memo. 它的内容是特殊一种文字(包括英文字符,数字和特殊符号)

如: memo 内容是 &#Nn DEeF
能不能把memo内容 &#Nn DEeF
转换成 #1575;#1592;#1588;#1608
#1585;#1586;#1605;#1570

( 必须能判断大小写字符 )
//////////////////////////////////////////////
对应表如下
原字符 目标

" #1592

&amp
#1575;
# #1592

' #1575;
( #1577;
) #1577;
n #1608

N #1588;
o #1584;
p #1573;
q #1609;
D #1585;
E #1586;
e #1605;
F #1570;
C #1583;
i #1606;
j #1606;
k #1606;
2 #1578;
3 #1578;
4 #1578;
* #1576

+ #1576;
- #1576

/ #1589;
0 #1589

1 #1589;
> #1582;
@ #1582;
A #1582;
B #1582;
5 #1580;
6 #1580;
7 #1580;
8 #1580;
9 #1581

: #1581

< #1581

= #1581;
y #1593;
z #1593;
w #1593

u #1574;
v #1574;
s #1574;
{ #1610;
| #1610;
} #1610;
~ #1610

V #1602

W #1602;
X #1602

S #1601;
U #1601

T #1601;
O #1594;
P #1594

Q #1594;
R #1594;
/ #1603

] #1603;
Y #1590

Z #1590

_ #1579

` #1579;
f #1605

g #1605;
G #1587

h #1605;
l #1607

m #1607

M #1588

b #1604

c #1604;
d #1604;
$ #1571

% #1571;
H #1587

I #1587

J #1587

K #1588;
L #1588;
r #1572


 
可以啊,替换就行了
StringList:
OriginCharList. ReplaceCharList 一一对应
for i:=0 to length(memo1.text) do
begin
s:=copy(memo1.text,i,1);
if OriginCharList.indexof(s)<>-1 then
s:=ReplaceCharList.strings[OriginCharList.indexof(s)]
memo1.text:=copy(memo1.text,1,i-1)+s+copy(memo1.text,i,length(memo1.text)-i)





end;
 
给你一个例子,看看吧
procedure ConvertString(Str: String
const OldString, NewString: String);
var
P: PChar;
i,Len: Integer;
Pos: Integer;
begin
Len:=Length(Str);
if (Len=0) or (Length(OldString)<>Length(NewString)) then
Exit;

P:=PChar(Str);
i:=0;
Len:=Length(Str);
while True do
begin
Pos:=AnsiPos(P^,OldString);
if Pos>0 then
P^:=(PChar(NewString)+Pos-1)^;
Inc(p);
Inc(i);
if i>Len then
Exit;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
STR1 = 'Memo1';
STR2 = 'Eaed2';
var
Str: String;
begin
Str:=Memo1.Lines.Text;
ConvertString(Memo1.Lines.Text,STR1,STR2);
Memo1.Lines.Text:=Str;
end;
 
这好办,我写个大概你看看

procedure tform1.changeto;
const
cListCount=3;
cList:array[1..cListCount,1..2] of char=(('a','&amp;#1572;'),('b','&amp;#1588;'),('c','&amp;#1588;'));
var
i,j:integer;
c:char;
s:string;
begin
s:='';
for i:=1 to length(memo1.text) do
begin
c:=copy(memo1.text,i,1)[1];
for j:=1 to cListCount do
begin
if c=cList[i,1] then
begin
s:=s+cList[i,2];
break;
end;
end;
end;
memo1.text:=s;
end;

 
这个用字符串解析
 
to :苦虫 朋友 刚才我写的对应表不太清楚,现在已经写好了
能不能把你的程序写的详细一点!!!!
程序能不能判断大小写字符?
 
大小写有函数判断的。
这个程序好像不难啊,只是繁点。上边给出的代码套用一下可以了。
 
再送一个,给分吧

procedure tform1.changeto;
type
PFd=^TFd;
TFd=record
zf:char;
wzf:widechar;
end;

const
cListCount=3;

var
i,j:integer;
c:char;
s:widestring;
cList:tlist;

procedure cListAdd(t:tlist;cc:char;wcc:widechar);
var
p:PFd;
begin
new(p);
p^.zf:=cc;
p^.wzf:=wcc;
t.Add(p);
end;

begin
s:='';

cList:=tlist.create;
cListAdd(cList,'a',#1592);
cListAdd(cList,'b',#1607);
cListAdd(cList,'c',#1712);
//这里可以添加其他符号的对应关系
for i:=1 to length(memo1.text) do
begin
c:=copy(memo1.text,i,1)[1];
for j:=0 to cList.Count-1 do
begin
if c=PFd(cList[j])^.zf then
begin
s:=s+PFd(cList[j])^.wzf;
break;
end;
end;
end;
for i:=0 to cList.count-1 do
dispose(cList);
cList.Free;
memo1.text:=s;
end;
 
如果是单字符 最终的优化还是查表的好 不过汇编忘得差不多了 而 PASCAL好像没有查表对应的算法吧
 
[:D][:D][blue]是啊是啊[/blue][:(][:(]
 
to 苦虫: 朋友你把程序 调试过吗?
你的程序我用不上了,需要你的帮助!!!!
能不能介绍一下你的程序
 
楼主:
抱歉,是我的疏忽,看看如何

procedure tform1.changeto;
type
PFd=^TFd;
TFd=record
zf:char;
wzf:widechar;
end;

const
cListCount=3;

var
i,j:integer;
c:char;
s:string;
cList:tlist;
m:tmemorystream;

procedure cListAdd(t:tlist;cc:char;wcc:widechar);
var
p:PFd;
begin
new(p);
p^.zf:=cc;
p^.wzf:=wcc;
t.Add(p);
end;

begin
s:='';

m:=tmemorystream.create;
m.SetSize(cListCount*sizeof(widechar));
cList:=tlist.create;
cListAdd(cList,'a',#1592);
cListAdd(cList,'b',#1607);
cListAdd(cList,'c',#1712);
//这里可以添加其他符号的对应关系
for i:=1 to length(memo1.text) do
begin
c:=copy(memo1.text,i,1)[1];
for j:=0 to cList.Count-1 do
begin
if c=PFd(cList[j])^.zf then
begin
m.write(PFd(cList[j])^.wzf,sizeof(widechar));
break;
end;
end;
end;
for i:=0 to cList.count-1 do
dispose(cList);
cList.Free;
m.Position:=0;
memo1.Lines.LoadFromStream(m);
m.Free;
end;
 
后退
顶部