首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi2010中将中文字符串转换为十六进制并达到与Delphi2007MBCS相同的效果

如何在Delphi2010中将中文字符串转换为十六进制并达到与Delphi2007MBCS相同的效果
EN

Stack Overflow用户
提问于 2011-07-23 14:31:31
回答 2查看 3K关注 0票数 1

此代码在delphi2007中转换成功例如:我有一个中文转换,在delphi2007中转换是B5 CC B5 C6,但在Delphi2010中转换是77 ED52 00

代码语言:javascript
复制
    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成功中编辑它是错误的?

EN

回答 2

Stack Overflow用户

发布于 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):

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
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函数的明确示例:

代码语言:javascript
复制
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之间的区别。

票数 3
EN

Stack Overflow用户

发布于 2011-07-25 10:15:13

要在D2010中获得与D2007中相同的结果,只需将函数参数从(Unicode)字符串更改为AnsiString即可。您传入的任何字符串值,无论类型如何,都将被RTL转换为基于系统默认代码页的MBCS等效值-相同的AnsiString在过去的版本中一直使用,并继续使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6798723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档