只要看5行代码,搞定者300大洋拿去!有关WideString 与 String的问题。 ( 积分: 300 )

  • 主题发起人 主题发起人 geng7758
  • 开始时间 开始时间
G

geng7758

Unregistered / Unconfirmed
GUEST, unregistred user!
//别又告诉我WideString到String也是Delphi自己会自动转换的,
//拜托先运行一下这个代码看看,
//我的目的就是String->WideString->String,
//就是说第一个和第二个的String要完全一样,包括长度及内容
//谁搞定300大洋给谁哦!
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str := Chr($81) + Chr(1);//注意81前面有个$,其实就是要试大于128的字符
ShowMessage(IntToStr(Length(Str)));
WStr := Str;
Str := WStr;//这一步就拜托各位加些冬冬了
ShowMessage(IntToStr(Length(Str)));//如果这里显示2,那就可能对了
end;
 
//别又告诉我WideString到String也是Delphi自己会自动转换的,
//拜托先运行一下这个代码看看,
//我的目的就是String->WideString->String,
//就是说第一个和第二个的String要完全一样,包括长度及内容
//谁搞定300大洋给谁哦!
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str := Chr($81) + Chr(1);//注意81前面有个$,其实就是要试大于128的字符
ShowMessage(IntToStr(Length(Str)));
WStr := Str;
Str := WStr;//这一步就拜托各位加些冬冬了
ShowMessage(IntToStr(Length(Str)));//如果这里显示2,那就可能对了
end;
 
你后边加的是#0,转换后就去掉了,你可以转换后再加一个 chr(0),如果后边不是#0就没什么事
 
可能要调用方法转化 copy 之类的
 
To:【清风】
你有没有试过?我现在改成:Str := Chr($81) + Chr(1);
 
String包含的字符是用单字节存储的, 而WideString 包含的字符则是用多个字节存储的,
而在目前的DELPHI 版本中,WideString被实现为用2个字节存储一个字符
例:
var
s: String;
ws: WideString;
begin
s:= '大富翁';
ws:= s;
showmessage(s[1])
{显示的是乱码,因为S[1]取出的是'大'的一半}
showmessage(ws[1])
{显示'大'}
end;
 
To: 卡布卡
关键是怎么转回去呢?
 
转回去干吗用的啊,
那样有点麻烦的。。
 
string转换至WideString时,若第一字节大于$80,则认为这是一个双字节的字符,与紧接着它的另一个字节组成一个字符。正因如此,Chr($81)+Chr(1)转成WideString后变成了一个字符,但是这个字符在码表中并不存在,于是乎,该字就用“?”表示了,再转回到string,当然还是一个字符“?”。
你可以把Chr($81)+Chr(1)改成Chr(1)+Chr($81)试试看,结果会是2。
或者你可改成Chr($80)+Chr(1)试试。
 
用下面這個就沒問題啊
var
Str: string;
WStr: WideString;
begin
Str := '大富翁';
ShowMessage(IntToStr(Length(Str)))
//6
WStr := Str;
ShowMessage(IntToStr(Length(WStr)));//3
Str := WStr;
ShowMessage(IntToStr(Length(Str)))
//6
 
var
s: String;
ws: WideString;
begin
s:= '大富翁';
ws:= s;
s:=ws
{ws被s引用}
showmessage(s[1])
{显示的是乱码,因为S[1]取出的是'大'的一半}
showmessage(ws[1])
{显示'大'}
end

难道这样不就可以了吗? 逻辑地址不同!
 
楼主
把你的代码改为
var
Str: string;
WStr: WideString;
begin
Str := Chr($80) + #0;
ShowMessage(IntToStr(Length(Str)));
WStr := Str;
Str := WStr;
ShowMessage(IntToStr(Length(Str)));
end;

结果就不一样了
 
十进制上大于128和小于等于128 的结果就不同了
 
让你失望了,就是Delphi自动转换的,用我的方法比较一下吧?
方法一:
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str :=Chr($81)+Chr(0);
ShowMessage(IntToStr(Length(Str)));
showmessage(str);
WStr :=Str;
Str :=WStr;
ShowMessage(IntToStr(Length(Str)));
showmessage(wstr);
end;
方法二:
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str :=Chr($80)+Chr(0);
ShowMessage(IntToStr(Length(Str)));
showmessage(str);
WStr :=Str;
Str :=WStr;
ShowMessage(IntToStr(Length(Str)));
showmessage(wstr);
end;
方法三:
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str :=Chr($81)+Chr($81)+Chr(0);
ShowMessage(IntToStr(Length(Str)));
showmessage(str);
WStr :=Str;
Str :=WStr;
ShowMessage(IntToStr(Length(Str)));
showmessage(wstr);
end;
方法四:
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
WStr: WideString;
begin
Str :=Chr($81)+Chr($81)+Chr($81)+Chr(0);
ShowMessage(IntToStr(Length(Str)));
showmessage(str);
WStr :=Str;
Str :=WStr;
ShowMessage(IntToStr(Length(Str)));
showmessage(wstr);
end;
具体的问题出在哪,那你得去看一看,chr()函数的用法,还有AnsiString和WideString与char的内在关系,在{$H+}时String就是AnsiString你应该清楚了吧?还有,在WideString中只有半wide字时它是怎么处理的!
 
procedure TForm1.Button2Click(Sender: TObject);
var
Str: string;
WStr: WideString;
i:integer;
begin
Str := '大富翁';
ShowMessage(Str);
WStr := Str;
ShowMessage(WStr);

Str:='';
for i := 1 to Length(WStr) do
begin
Str := Str + WStr;
end;
ShowMessage(Str);
end;
 
大家要试就一定加个16位的单字字符到str才能知道有没有解决的
 
去这看看
http://www.01cn.net/cgi-bin/topic_show.cgi?id=1224&h=1&bpg=1&age=0
 
function WideStringToStringEx(const WS: WideString
CodePage: Word): String;
var
L: Integer;
begin
L := WideCharToMultiByte(CodePage, 0, PWideChar(WS), -1, nil, 0, nil, nil);
SetLength(Result, L-1);
WideCharToMultiByte(CodePage, 0, PWideChar(WS), -1, PChar(Result), L - 1, nil, nil);
end;

var
s:string;
w:widestring;
begin
s:=Chr(81)+Chr(3);
w:=widestring(s);
s:=WideStringToStringEx(w,2);
showMessage(IntToStr(Length(s)));
ShowMessage(IntToStr(Ord(s[2])));
end;
测试通过
参见http://www.delphibbs.com/delphibbs/dispq.asp?LID=639828
 
很想知道Chr($81)是代表什么意思啊?
 
To smokingroom:
字节顺序不能变
To Avalon:
就是要试$80以后的字符
To 爱不到要偷:
没用
To 扬扬:
把你的Chr(81)改成Chr($81)试试就知道没用了
 

Similar threads

后退
顶部