DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 5
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/17 13:55:34
标题:
各位大师求助,D7下的代码转换到XE10下,谢谢 浏览:2461
加入我的收藏
楼主: 那位大师能够把下面的代码帮忙转换到XE10下,在D7下面是正常的,但到XE10下就不支持中文转换了,就是字符通过a1转换,然后又通过a2转换到原来的,现在XE10下英文数字可以但中文不行,显示乱码,那位大师给解决一下,谢谢!

function a1(Str: String): String;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(Str) do
      result := result + IntToHex( Ord( Str[i] ), 2 );
end;

function a2(Str: String): String;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(Str) do
    begin
      if ((i mod 2) = 1) then  result := result + chr( StrToInt( '0x' + Copy( Str, i, 2 )));
    end;
end;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 13:57:06
1楼: 这种低级代码售价 500万人民币。
要么?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 14:20:35
3楼: 跨平台 Unicode string 用 HexToStr StrToHex
http://www.2pascal.com/forum.php?mod=viewthread&tid=2731&fromuid=4
(出处: 2Pascal-新时代的Pascal)
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 14:36:51
5楼: 3 楼已经是答案了 爱看不看。爱信不信。关我屁事。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 15:00:43
2楼: 出现问题的原因是XE10的string与D7的string完全不同的内部格式。d7的string是AnsiString,用2个字节存汉字,一个字节存英文,XE10的string是UnicodeString,英文与中文都用2个字节来保存一个字符,按下面改一下就能够同时在d7与xe10下运行了,需要注意的是转换后的Hex是不同的。
function a1(Str: String): String;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(Str) do
      result := result + IntToHex( Ord( Str[i] ), 4 );
end;

function a2(Str: String): String;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(Str) do
    begin
      if ((i mod 4) = 1) then  result := result + chr( StrToInt( '0x' + Copy( Str, i, 4 )));
    end;
end;

附测试代码:
此帖子包含附件:c5soft_2016121715043.zip 大小:1,819B
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/17 15:06:48
6楼: @c5soft万分感谢,绝望之时看到一盏明灯.那现在有没有办法可以做到D7下面的程序中文字符转换后的可以在XE10下面正常到原来的中文字符.同样,XE10下编译的程序转换后存储到数据库里面的内容D7下面的程序也可以正常转换到原来的中文字符.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 15:16:05
7楼: 更定是有办法的,D7与XE10可以统一使用WideString,两者内部储存格式是一致的。那就不用用Ord于Chr这两个函数了,需要自己来编转换函数。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 15:19:55
8楼: 老子 3楼 给的 就有 与 D7 一致的 代码。可惜楼主不信。

其实 有简单的办法。但是 不能跨平台,也不支持多种编码。所以我也就不考虑这种简单办法了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 15:31:00
9楼: 给你看 D7 的,这可是你的代码。
此帖子包含附件:
PNG 图像
大小:72.7K
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 15:31:21
10楼: 再给你看 RAD10.1.2 的。这是 3 楼的代码。
此帖子包含附件:
PNG 图像
大小:111.7K
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 15:35:05
11楼: 其实 图中的 任意 是 错的,对于 D7 来说,只能是 ANSI 字符串。

另外,楼主怎么删了 你发的 2 楼了?
是不是丢你的脸了?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 15:35:28
11楼: 内部编码也可以统一成UTF8,但比WideString更麻烦一些
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 16:45:13
12楼: 搞定了:
function WStr2Hex(const AStr: WideString): AnsiString;
var
  i: integer;
  p:PAnsiChar;
begin
  Result:='';
  p:=PAnsiChar(Integer(AStr)-1);
  for i := 1 to Length(AStr)*2 do
      Result := Result + IntToHex( Byte(p[i]), 2 );
end;

function Hex2WStr(const AHex: AnsiString): WideString;
var
  i: integer;
  p:PByte;
begin
  SetLength(Result,Length(AHex) div 4);
  p:=PByte(Integer(Result));
  for i := 1 to Length(AHex) div 2 do
    begin
      p^:= (StrToInt('0x'+Copy(AHex,(i-1)*2+1,2)));
      Inc(p);
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   edit1.Text:=WStr2Hex(edit0.text);
   edit2.Text:=Hex2WStr(edit1.Text);
end;
此帖子包含附件:c5soft_20161217164513.zip 大小:49.0K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 16:47:37
13楼: D7与XE10内码统一使用WideChar
此帖子包含附件:
JPEG 图像
大小:39.9K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/12/17 18:32:05
14楼: 我也来一个。
此帖子包含附件:
PNG 图像
大小:107.5K
----------------------------------------------
(C)(P)Flying Wang
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/17 21:40:47
15楼: 感谢c5soft ,感谢 wang_80919,感谢两位大师的无私奉献。

另外@c5soft,在Xe10下对p^:= (StrToInt('0x'+Copy(AHex,(i-1)*2+1,2)));代码编译提示w1057 implicit string cast from 'Ansistring' to 'string'的Warning,请再给看一下,谢谢。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 22:02:16
16楼: ansistring到string的隐式转换时安全的,可以忽略。要是有强迫症,给你一个没有任何warning的版本,这次将Hex2WStr/WStr2Hex独立出来单独放在一个文件中。
{
WideString to UTF16-LE Byte Encoding HEX Converting 
Support Delphi7 to Delphi 10.1 Berling
by c5soft@189.cn, Version 1.0.0.0, 2016-12-17
}
unit uWStr2Hex;

interface

function WStr2Hex(const AStr: WideString): string;
function Hex2WStr(const AHex: string): WideString;


implementation

uses sysUtils;

function WStr2Hex(const AStr: WideString): string;
var
  i: integer;
  p:PAnsiChar;
begin
  Result:='';
  p:=PAnsiChar(Integer(AStr)-1);
  for i := 1 to Length(AStr)*2 do
      Result := Result + IntToHex( Byte(p[i]), 2 );
end;

function Hex2WStr(const AHex: string): WideString;
var
  i: integer;
  p:PByte;
begin
  SetLength(Result,Length(AHex) div 4);
  p:=PByte(Integer(Result));
  for i := 1 to Length(AHex) div 2 do
    begin
      p^:= StrToInt('0x'+Copy(AHex,(i-1)*2+1,2));
      Inc(p);
    end;
end;


end.
此帖子包含附件:c5soft_2016121722216.zip 大小:49.3K
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/17 22:14:55
17楼: @c5soft真是太感谢了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 22:16:02
17楼: 附送大家一个小技巧
==========

问题:同一个项目,同时用XE10.1与Delphi7编译的,如果先用XE10.1编译运行,再用Delphi7编译运行,会出现Delphi7编译后的exe显示不正常的情况。

解药:删除与exe同名的res文件(这个是XE10.1建立的),在Delphi7中重新打开项目,让delphi7自动重建res文件,编译运行,问题即可解决。
此帖子包含附件:
JPEG 图像
大小:30.0K
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/17 22:32:38
18楼: 再次感谢c5soft,wang_80919两位大师的无私奉献,本问题到此结束,结帖.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 22:41:22
19楼: 这是1.0.0.1版本,这次内部转换统一用PByte,代码更干净:

{**********
WideString to UTF16-LE Byte Encoding HEX Converting
Support Delphi7 to Delphi 10.1 Berling
by c5soft@189.cn, Version 1.0.0.1, 2016-12-17
**********}
unit uWStr2Hex;

interface

function WStr2Hex(const AStr: WideString): string;
function Hex2WStr(const AHex: string): WideString;


implementation

uses sysUtils;

function WStr2Hex(const AStr: WideString): string;
var
  i: integer;
  p: PByte;
begin
  Result := '';
  p := PByte(AStr);
  for i := 1 to Length(AStr) * 2 do begin
    Result := Result + IntToHex(p^, 2);
    Inc(p);
  end
end;

function Hex2WStr(const AHex: string): WideString;
var
  i: integer;
  p: PByte;
begin
  SetLength(Result, Length(AHex) div 4);
  p := PByte(Result);
  for i := 1 to Length(AHex) div 2 do begin
    p^ := StrToInt('0x' + Copy(AHex, (i - 1) * 2 + 1, 2));
    Inc(p);
  end;
end;


end.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/17 23:12:13
20楼: 这是1.0.0.2版本,这次内部用PWord,一次处理两个字节,速度更快。输出的十六进制串位置有所不同,是UTF16-BE编码,1.0.0.1是UTF16-LE编码。
字符串:  ab1
UTF16-LE: 610062003100
UTF16-BE: 006100620031
下面是源代码:
{**********
WideString to UTF16-BE Byte Encoding HEX Converting
Support Delphi7 to Delphi 10.1 Berling
by c5soft@189.cn, Version 1.0.0.2, 2016-12-17
**********}
unit uWStr2Hex;

interface

function WStr2Hex(const AStr: WideString): string;
function Hex2WStr(const AHex: string): WideString;


implementation

uses sysUtils;

function WStr2Hex(const AStr: WideString): string;
var
  i: integer;
  p: PWord;
begin
  Result := '';
  p := PWord(AStr);
  for i := 1 to Length(AStr)  do begin
    Result := Result + IntToHex(p^, 4);
    Inc(p);
  end
end;

function Hex2WStr(const AHex: string): WideString;
var
  i,nLen: integer;
  p: PWord;
begin
  nLen:=Length(AHex) div 4;
  SetLength(Result, nLen);
  p := PWord(Result);
  for i := 1 to nLen do begin
    p^ := Word(StrToInt('0x' + Copy(AHex, (i - 1) * 4 + 1, 4)));
    Inc(p);
  end;
end;


end.
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/18 14:23:49
21楼: @c5soft大师真是热心肠啊,太感谢了.当前又遇到一个很疑惑的问题,请帮忙看看是怎么一回事,比如我放置一个TEdit组件,然后写代码时edit1.一般后面加上小点后会立即出现该edit的各种属性比如txt等等,但现在加后面小点后不出现其各种属性了,然后左上边的那个面板的树状列表里面列出好多错误,这样就造成很多不便,因为有好多属性记不住,请问该怎样解决?是什么问题导致的呢?另外强调一下,在写这句代码之前所有的代码都是没有问题的,都是可以正常通过编译的,具体表现请看附件中的图片.谢谢.
此帖子包含附件:
PNG 图像
大小:29.6K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/12/18 14:43:54
22楼: Delphi的代码补全功能需要在前面的代码编译无误的情况下才能使用。先把edit13.清除,编译,如果不报错,再重新输入,就应该OK了。

另外如果编译的程序在运行状态,也是不能使用代码补全功能的。
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/18 15:18:14
23楼: @c5soft,在写这句代码之前所有的代码都是没有问题的,都是可以正常通过编译的,但就是不行,已经遇到多次了,只要一输入小点后立即鼠标旋转并左上角那些错误提示,这次又遇到了所以问问您这个问题.
----------------------------------------------
-
作者:
男 tqc2008 (dddd) ★☆☆☆☆ -
普通会员
2016/12/18 15:42:26
24楼: @c5soft,又重新关机开机,重新打开编译器,然后再输入就可以出现下拉属性了。
----------------------------------------------
-
作者:
男 feidian (非典) ★☆☆☆☆ -
普通会员
2016/12/19 23:33:04
25楼: 碰到代码不能补全的情况,一般来说都是很难查找的,它其实是因为用{}来注释无用代码的时候,应用在代码的标题行或者在{$R *.DFM}以前,有时候是用在if语句中间。在代码少的时候,没有任何不良反应,但不一定什么时候就会随着代码的增加而出现无法进行代码补全。其发病原理不清楚。我也是在极其偶然的情况下发现这个事情。最主要的是,用{}来注释代码是正常行为,而发病是随机的,但必然是在代码量比较多的时候才会有可能出现。一旦出现,令人发狂。
----------------------------------------------
河里的青蛙,是天才的脱胎
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行230.4688毫秒 RSS