此代码在delphi2007中转换成功例如:我有一个中文转换,在delphi2007中转换是B5 CC B5 C6,但在Delphi2010中转换是77 ED52 00
function StringToHex(str: string): string;
var
i:integer;
s:string;
begin
s:='';
for i:=1 to length(str) do begin
s:=s+inttohex(Integer(str[i]),2);
end;
result:=s;
end;但在delphi2010中,谁可以在delphi2010成功中编辑它是错误的?
发布于 2011-07-23 23:13:40
首先,在Delphi2007中使用String=AnsiString,在Delphi2010中使用String=UnicodeString。如果您知道AnsiString (char是8位)和UnicodeString (char是16位)是什么意思,那么这就足以让您理解。
即使您正在调用" IntToHex (x,2)",每个Delphi2010字符在转换为整数时都将在0到65535的范围内,这意味着IntToHex调用返回的是2到4个十六进制数字,这使得您很难正确读取结果。
最小的unicode感知修复是更改为IntToHex(x,4)用于delphi的unicode版本,并可能在其中放一个空格,这样您至少可以看到代码点分隔四位数字的位置,例如0000对于表示为十六进制的单个unicode字符来说,十六进制数字就足够了。两位数是不够的。
但是为什么这些值是不同的呢?这是个好问题。让我试着让它变得更清楚;我相信你正在看到使用Delphi2007及其ANSI+MBCS支持(它依赖于代码页)与使用Unicode字符串的Delphi2010的结果。MBCS值与unicode代码点不同,您不应对此感到惊讶。
您还应该知道,需要两个十六进制数字来显示一个字节,四个十六进制数字来显示一个Unicode字符,它的大小为16位。
如果你真的想看到UTF8字符串的十六进制,那么在Delphi2010中,你必须首先创建一个UTF8字符串。如果你真的想要MBCS,那就直说吧。现在全世界都是Unicode了,我建议你放弃MBCS。
修复了Unicode字符串字符代码点(4个十六进制数字,16位)的代码:
支持UnicodeString=String的版本(Delphi 2009,2010,XE):
function StringToHex16(str: string): string;
var
i:integer;
s:string;
begin
s:='';
for i:=1 to length(str) do begin
s:=s+inttohex(Integer(str[i]),4);
end;
result:=s;
end;用于Delphi 2009、2010、XE的UTF8版本:
function StringToHexUtf8(str: string): string;
var
i:integer;
s:string;
u:RawByteString;
begin
u := Utf8String(str);
s:='';
for i:=1 to length(u) do begin
s:=s+inttohex(Integer(u[i]),2);
end;
result:=s;
end;最后,由于您想要的可能是准确地重现Delphi 2007的行为,下面是一个使用MBCS函数的明确示例:
function StringToHexMbcs(str: string;cp:Integer): string;
var
sz,i:integer;
s:string;
u:RawByteString;
flags:Integer;
begin
// use cp 936 or 950 for simplified or traditional chinese mbcs.
flags := WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR;
sz := Windows.WideCharToMultiByte( cp, flags, @str[1],-1,nil,0,nil,nil); // get length.
SetLength(u,sz+1);
Windows.WideCharToMultiByte( cp, flags, @str[1],Length(str),@u[1],sz-1, nil,nil);
s:='';
for i:=1 to sz do begin
s:=s+inttohex(Integer(u[i]),2);
end;
result:=s;
end;不过,对于未来的参考,Delphi 2007并不是什么是“正确”的黄金标准。您必须努力理解MBCS和Unicode之间的区别。
发布于 2011-07-25 10:15:13
要在D2010中获得与D2007中相同的结果,只需将函数参数从(Unicode)字符串更改为AnsiString即可。您传入的任何字符串值,无论类型如何,都将被RTL转换为基于系统默认代码页的MBCS等效值-相同的AnsiString在过去的版本中一直使用,并继续使用。
https://stackoverflow.com/questions/6798723
复制相似问题