首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

分隔字符串的简单有关问题

2012-02-27 
分隔字符串的简单问题|310109570629206|朱弢||310109570629206|钟韡忆||310109570629206|蒋珅吉||31010957

分隔字符串的简单问题
|310109570629206 |朱弢 |
|310109570629206 |钟韡忆 |
|310109570629206 |蒋珅吉 |
|310109570629206 |汪丽韡 |

将数据放入数组中
ssTemp:= TStringList.Create;
ssTemp.Text := replace(trim(strings[j]),'|',#13#10);
 
这时候少数一部分姓名读取出来是乱码(如上,大部分没有问题),将分隔符'|'换成'@'就没有问题。
初步判断应该'|'引起的。有没有办法在保留'|'分隔符的前提下将信息正确的读取出来。
先谢谢了

[解决办法]
button1事件
procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
for i :=0 to memo1.Lines.Count-1 do begin
ExtractStrings(['|'],[' '],pchar(memo1.Lines[i]),memo2.Lines);
end;
end;

memo1放入的要转换的
|310109570629206 |朱弢 |
|310109570629206 |钟韡忆 |
|310109570629206 |蒋珅吉 |
|310109570629206 |汪丽韡 |

memo2来接收没发现有乱码的 结果如下
Memo2
310109570629206 
朱弢 
310109570629206 
钟韡忆 
310109570629206 
蒋珅吉 
310109570629206 
汪丽韡 

[解决办法]
既然是固定格式你完全可以忽略分隔符,直接用Copy从中间取出子串来。

copy(xxx, 2, 15)就是前面的数字了,后面的姓名一样处理。两个字或者三个字用字符串总长就可以判断。
[解决办法]

探讨
引用:
1.你用的是什么版本的DELPHI,2009以上的可能是unicode的问题
2.replace函数是自己写的吗?


1.我用的是delphi5 .
2.replace 函数如下
function replace(str:string;subStr:string;replaceStr:string):string;
var i:integer;
begin
i:=Pos(subStr,str);
while i >0 do
begin
Delete(str,i,length(subStr));
Insert(replaceStr,str,i);
i:=Pos(subStr,str);
end;
Result:=str;
end;

[解决办法]
我在delphi6下用#4的的确有乱码,这样就可以:
procedure TForm1.Button1Click(Sender: TObject);
var
s:WideString;
begin
 s:=memo1.Lines.Text;
 s:=StringReplace(s,'|',#13#10,[rfReplaceAll]);
 Memo2.lines.add(s);
end;
看来是ExtractStrings的问题

[解决办法]
探讨
引用:
我在delphi6下用#4的的确有乱码,这样就可以:
procedure TForm1.Button1Click(Sender: TObject);
var
s:WideString;
begin
s:=memo1.Lines.Text;
s:=StringReplace(s,'|',#13#10,[rfReplaceAll]);
Memo2.lines.add(s);
end;
看来是ExtractStrings的问题


请问我的代码问题在哪里?

[解决办法]
刚才看了下lz的例子,个人认为:

因为汉字是占双字节,恰好'|'字符的ascii码值在你每个名字里面都可能有与'|'字符相同的值 所以在你用replace函数替换的时候不仅仅替换掉本身要替换的'|'字符,而且还把名字中与'|'字符ascii码相等的字节替换掉了(因为你这里定义为string类型,pos的时候就按照单字节去搜索,1个汉字就会比对2次)。

热点排行