汉字乱码、加密后结果字符串不一致

汉字乱码、加密后结果字符串不一致

以上问题,常见于跨语言或跨操作系统平台。

遇到这种问题,许多人不知所措。

引子:

procedure TForm1.btn1Click(Sender: TObject);
var
  SERCRET: string;
  signSrc: string;
begin
  SERCRET := '9dcbb3305c991fe6581c43058efae380';
  signSrc := 'Application-key=e1fce770a0abb2a831d7058d8251e211&X-Yx-Nonce=109418174&X-Yx-Timestamp=1622083573769';
  signSrc := THashSHA2.GetHMAC(signSrc, SERCRET, SHA256);
  me_Msg.Lines.Add('signSrc HMAC SHA256:'+signSrc);
end;

end.
算出来的结果:f209398656572d6e42cb9df347b6a1a1b9e36dd7b1b4c799cf75ec25bf737f5e
还是跟Java的签名算法的结果不一致。
  Java的结果:1b85a20c429d4949256cc55f735cb312db943ede2637c6dad1ccec3d07274e3f

原因:charset 必须一样,比如java方是utf8, delphi方也要utf8。

高版本DELPHI可方便指定CHARSET:

DELPHI  字符串同tbytes相互转换时要指定 charset。

charset不同,同样加密算法 得出的结果字符串是不同的。

中文乱码原因,也是charset不一致所造成的,不同的charset,汉字内码也是不同的。

关于json字符串处理中文的问题
因为 服务端和客户端我们都使用相同版本的delphi开发,所以习惯直接传中文。
但 服务端和客户端如果是跨语言开发,怎么办?
其实业界通常的做法是 使用汉字内码。
只要不同开发语言方,使用统一的charset,json中的汉字就不会乱码。
DELPHI的JSON类,一般有2个方法:asJson 和 asString,前者会将JSON字符串中的汉字转换为汉字内码,后者则不会。

 

posted @ 2021-05-28 10:29  delphi中间件  阅读(463)  评论(0编辑  收藏  举报