简化一下,情形就是这样的,你看看最后的tmpStr就是#0了 var tmpStrList:TStringList; tmpStr:AnsiString; begin tmpStrList:=TStringList.create; tmpStrList.add('a=test'); tmpStr:=ansiChar(168);//#$A8 tmpStrList.Values['a']:=tmpStr; tmpStr:=tmpStrList.Values['a'];//tmpStr就变成#0了 end;
var tmpStrList:TStringList; tmpStr:AnsiString; begin tmpStrList:=TStringList.create; tmpStrList.add('a=test'); tmpStr:=ansiChar(168);//#$A8 tmpStrList.Values['a']:=tmpStr; tmpStr:=tmpStrList.Values['a'];//tmpStr就变成#0了 end;
我自己写的TAnsiStringList type TAnsiStringList=class(TPersistent) private FText:AnsiString; FCount:Integer; NameSeparator:AnsiString; RowSeparator:AnsiString; function GetValues(const Names: AnsiString): AnsiString; procedure SetValues(const Names, Value: AnsiString); function GetCount: Integer; function GetText: AnsiString; published public constructor Create; property Text:AnsiString Read GetText write FText; property Values[const Names:AnsiString]:AnsiString read GetValues write SetValues; property Count:Integer Read GetCount; function Add(S:AnsiString):integer; procedure Assign(Source:TPersistent); end;{ TAnsiStringList }procedure TAnsiStringList.Assign(Source: TPersistent); begin if Source is TAnsiStringList then begin Self.FText:=TAnsiStringList(Source).FText; Self.FCount:=TAnsiStringList(Source).FCount; Self.NameSeparator:=TAnsiStringList(Source).NameSeparator; Self.RowSeparator:=TAnsiStringList(Source).RowSeparator; end; end;constructor TAnsiStringList.Create; begin RowSeparator:=#$D#$A; NameSeparator:='='; FText:=RowSeparator; FCount:=0; end;function TAnsiStringList.Add(S: AnsiString): integer; begin FText:=FText+S+RowSeparator; FCount:=FCount+1; end;function TAnsiStringList.GetCount: Integer; begin Result:=FCount; end;function TAnsiStringList.GetText: AnsiString; begin Result := FText; delete(Result,1,Length(RowSeparator)); end;function TAnsiStringList.GetValues(const Names: AnsiString): AnsiString; var P:integer; tmpStr,NameStr:AnsiString; begin Result:=''; tmpStr:=FText; NameStr:=RowSeparator+Names+NameSeparator; p:=pos(NameStr,tmpStr); if p<>0 then begin delete(tmpStr,1,p+length(NameStr)-1); Result:=Copy(tmpStr,1,Pos(RowSeparator,tmpStr)-1); end; end;procedure TAnsiStringList.SetValues(const Names, Value: AnsiString); var CurrValue,tmpStr,BeforeStr,NameStr:AnsiString; P:integer; begin tmpStr:=FText; NameStr:=RowSeparator+Names+NameSeparator; P:=pos(NameStr,tmpStr); if P<>0 then begin BeforeStr:=Copy(tmpStr,1,P-1); delete(tmpStr,1,P+length(NameStr)-1); delete(tmpStr,1,pos(RowSeparator,tmpStr)-1); FText:=BeforeStr+RowSeparator+Names+NameSeparator+Value+tmpStr; end; end;
var
tmpStrList:TStringList;
tmpStr:AnsiString;
begin
tmpStrList:=TStringList.create;
tmpStrList.add('a=test');
tmpStr:=ansiChar(168);//#$A8
tmpStrList.Values['a']:=tmpStr;
tmpStr:=tmpStrList.Values['a'];//tmpStr就变成#0了
end;
var
tmpStrList:TStringList;
tmpStr:AnsiString;
begin
tmpStrList:=TStringList.create;
tmpStrList.add('a=test');
tmpStr:=ansiChar(168);//#$A8
tmpStrList.Values['a']:=tmpStr;
tmpStr:=tmpStrList.Values['a'];//tmpStr就变成#0了
end;
关键的问题是从ansiString到String的赋值会出现字符丢失
1、請回答Ansichar得到的字符編碼是什么?
2、假設能夠得到,預期結果又是什么?
具体演示见截图http://sunjunbo.com/documents/TempImages/AnsiString与String问题截图1.jpg
http://sunjunbo.com/documents/TempImages/AnsiString与String问题截图2.jpg
那你知道$A8 又是什么呢?
AnsiChar(168)得到的是不是應為可理解的字符呢?很顯然,這個轉換并不能得到預期的結果,請參考ASCII對照表,轉化結果應該與這個表相符合,不然這樣的轉換又有何意義?問題應該回到你的原點:你想實現什么?為什么需要Ansichar執行這樣的轉換?
问题是:AnsiChar转换出来的结果能保存在AnsiString,但不能保存到string中
http://topic.csdn.net/u/20100121/20/6a051e08-c744-4042-b53a-b76f1af669d7.html
我研究了半天,实际上也没解决TStringList的Unicode问题
关于TStringList中的unicode感觉除非自己重新以非unicode方式重构这个类.否则无法解决转码的问题
不行的话,只能用List或动态数组了
1.是否一定需要这样的转换操作?
2.能否用别的方法?
tmpStr:=UnicodeString(ansiChar(168));// 不记得是 这个还是直接用String了。
我已经放弃TStringList存储字节流了,自己写了一个TAnsiStringList类用来存储,重写也不太麻烦,只是按照自己的需求构造了一下,也不知道效率如何,一会儿吃过饭贴出来看看,请诸位网友提意见。
private
FText:AnsiString;
FCount:Integer;
NameSeparator:AnsiString;
RowSeparator:AnsiString;
function GetValues(const Names: AnsiString): AnsiString;
procedure SetValues(const Names, Value: AnsiString);
function GetCount: Integer;
function GetText: AnsiString;
published
public
constructor Create;
property Text:AnsiString Read GetText write FText;
property Values[const Names:AnsiString]:AnsiString read GetValues write SetValues;
property Count:Integer Read GetCount;
function Add(S:AnsiString):integer;
procedure Assign(Source:TPersistent);
end;{ TAnsiStringList }procedure TAnsiStringList.Assign(Source: TPersistent);
begin
if Source is TAnsiStringList then
begin
Self.FText:=TAnsiStringList(Source).FText;
Self.FCount:=TAnsiStringList(Source).FCount;
Self.NameSeparator:=TAnsiStringList(Source).NameSeparator;
Self.RowSeparator:=TAnsiStringList(Source).RowSeparator;
end;
end;constructor TAnsiStringList.Create;
begin
RowSeparator:=#$D#$A;
NameSeparator:='=';
FText:=RowSeparator;
FCount:=0;
end;function TAnsiStringList.Add(S: AnsiString): integer;
begin
FText:=FText+S+RowSeparator;
FCount:=FCount+1;
end;function TAnsiStringList.GetCount: Integer;
begin
Result:=FCount;
end;function TAnsiStringList.GetText: AnsiString;
begin
Result := FText;
delete(Result,1,Length(RowSeparator));
end;function TAnsiStringList.GetValues(const Names: AnsiString): AnsiString;
var
P:integer;
tmpStr,NameStr:AnsiString;
begin
Result:='';
tmpStr:=FText;
NameStr:=RowSeparator+Names+NameSeparator;
p:=pos(NameStr,tmpStr);
if p<>0 then
begin
delete(tmpStr,1,p+length(NameStr)-1);
Result:=Copy(tmpStr,1,Pos(RowSeparator,tmpStr)-1);
end;
end;procedure TAnsiStringList.SetValues(const Names, Value: AnsiString);
var
CurrValue,tmpStr,BeforeStr,NameStr:AnsiString;
P:integer;
begin
tmpStr:=FText;
NameStr:=RowSeparator+Names+NameSeparator;
P:=pos(NameStr,tmpStr);
if P<>0 then
begin
BeforeStr:=Copy(tmpStr,1,P-1);
delete(tmpStr,1,P+length(NameStr)-1);
delete(tmpStr,1,pos(RowSeparator,tmpStr)-1);
FText:=BeforeStr+RowSeparator+Names+NameSeparator+Value+tmpStr;
end;
end;