RSA签名之:GB2312转UTF-8编码:

本文介绍了如何在Windows和Linux环境下将GB2312编码转换为UTF-8编码的方法。在Windows下通过MultiByteToWideChar和WideCharToMultiByte函数实现;在Linux环境下使用iconv库函数进行编码转换。

1Windows版本下的UTF-8编码的转换:

项目组以前实现了对MD5签名的初期版本,但是无法支持汉字等宽字符的转换。以前对于所有的char*型字符,直接一个byte*型,强制转换成byte型字符。但是这么做有很大的弊端,256ASCII字符本身只有一个字节,所有强制将char*字符转换成byte*型字符没有问题,可是对于汉字等宽字符,由于每个字符有2个字节的宽度,所以转换之后,将会出现乱码。

而如果将char*型字符转换成UTF-8编码,将不会出现上述问题。

UTF-8对于ASCII字符仍保持原值,而对于非ASCII字符则进行了转换。具体知识可以查看相关的UTF-8编码知识。

windowsGB2312UTF-8

具体实现:

char* Gb2312ToUTF_8(char* gb2312)

实现将GB2312编码转换成UTF-8编码。

其中调用了windows.h中的系统函数

以下是MSDN中对我调用的系统函数的解释

Maps a character string to a wide character (Unicode UTF-16) string. The character string mapped by this function is not necessarily from a multibyte character set.

int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,        

  LPCSTR lpMultiByteStr,

  int cbMultiByte,      

  LPWSTR lpWideCharStr, 

  int cchWideChar       

);

Maps a wide character string to a new character string. The new character string is not necessarily from a multibyte character set.
int WideCharToMultiByte(
  UINT CodePage, 
  DWORD dwFlags, 
  LPCWSTR lpWideCharStr,
  int cchWideChar, 
  LPSTR lpMultiByteStr, 
  int cbMultiByte,
  LPCSTR lpDefaultChar,    
  LPBOOL lpUsedDefaultChar
);
 
源代码:

char* Gb2312ToUTF_8(char* gb2312)

{

     int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);

     wchar_t* wstr = new wchar_t[len+1];

     memset(wstr, 0, len+1);

     MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);

     len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);

     char* str = new char[len+1];

     memset(str, 0, len+1);

     WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);

     if(wstr) delete[] wstr;

          return str; // _DEBUG

}

 

上面得到还是char*型表示的UTF-8编码,为了适应MD5,我编写了一个转换函数实现char*byte*

//charbyte型。

int  MD5::charToByte(char *SrcData,int len)

{

     char* destPtr = SrcData;

     BUtf8 = new byte[len];

     for(int i=0; i<len; i++)

     {

         if(*destPtr < 0)

              BUtf8[i] = 256 +  *destPtr;

         else

              BUtf8[i] =  *destPtr;

         destPtr++;

     }

     return len;

}

此处要注意释放BUtf8指针,我的实现是在MD5的析构函数中释放。

经过测试后,一切正常。

 

 

可怜的5.4居然还要加班。。

我以为实现了UTF-8编码转换功能,谁知道还有Linux版本的UTF-8忘了实现。Windows版本是调用了windows的系统函数,而linux却不能调用这个函数。

于是,马上找资料。

2Linux版本下UTF-8转换

char* Gb2312ToUTF_8(char* gb2312)

 

涉及到得头文件及函数:

#include <iconv.h>

具体实现

int MD5::code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)

{

#ifndef WIN32

     iconv_t cd;

     int rc;

     char **pin = &inbuf;

     char **pout = &outbuf;

 

     cd = iconv_open(to_charset,from_charset);

     if (cd==0) return -1;

     memset(outbuf,0,outlen);

     if (iconv(cd,pin,(size_t*)&inlen,pout,(size_t*)&outlen)==-1) return -1;

     iconv_close(cd);

#endif

     return 0;

}

POST /mgw.htm HTTP/1.1 uid: 1322822353751369 mtraceid: f1654861-e435-4f2a-9772-6347b1a30977 x-h5-version: 5.4 x-source: fans lastclickspm: a2811.b35286.c90161.d186758 x-universe-version: 25.5.1.0 pagets: a2811.b35286__PR3spmi_ x-platform: Android x-universe-source: fans-main nbappid: 68687967 nbversion: 25.5.1.1 srcspm: a2811.b35250.c90146.d210490 x-fans-version: 2.39.0 x-68687967-version: 25.5.1.1 x-device-token: qXtSiOYNuUeE9P4gscr0qUz7LpP4SrqM1/ONplBpaUBesszClgEAAA== x-device-color: AQAA_JRAIWbuYJH547/4jQmdChB52J8Xw8zH1Si8TODZVw6eUmEzvkeiX4O8OjN0zZ2U7 x-device-utdid: aA8SgXtKnMYDALx+galEw0QJ x-device-model: Mi 10 x-fans-utdid: 009&51bf1e2b1Rnu3su+fIeQOisnQ4Ut7g== hx: 1747042648520,b4e6ba11-fc81-4e18-a600-3752c7d57c41,38 qm: AQAB_BEFORFaF/othAAAAMAAxAEuPZ7zJQdvDlgEAACUQCFm7mCR+eO/+I0JnQoQedifF8PMx9UovEzg2VcOnlJhM75Hol+DvDozdM2dlOwES3CflNZNW0tMUvllj8lNAiMU/CiY31dJklVnNrC50Tix1FZQwlO1n+bZUQHTkBGQ= x-device-timestamp: 1747042648520 Platform: ANDROID AppId: ALIPUB059F038311550 WorkspaceId: prod productVersion: 1.8.5.240509143035 productId: ALIPUB059F038311550_ANDROID Version: 2 Did: TEMP-aA8SgXtKnMYDALx+galEw0QJ Operation-Type: com.antgroup.antchain.mymobileprod.service.order.getNftTradeNo Ts: PR3sq7C Content-Type: application/json Sign: 5a3264aee0762561666991a485474c0c signType: 0 x-app-sys-Id: com.antfans.fans Cookie: aliyungf_tc=9773b6a30b0192f9d323f776b0031dc5924572546af653287f9276f6a95355b9; sessionId=ahs86vk9QUT83qW174634169018801369 RpcId: 696 TRACEID: TEMP-aA8SgXtKnMYDALx+galEw0QJPR3sq7C_696 Retryable2: 0 Accept-Language: zh-Hans Accept-Language: zh-Hans Accept-Encoding: gzip Connection: Keep-Alive Content-Length: 137 Host: mgs-mpaas.antfans.com User-Agent: Android_Ant_Client [{"jtMixAuthCode":"","jtMixTs":1747042648507,"jtMixUnique":"e28a2fb5f6501774a284768df91d66f51d9a99d5","orderNo":"202505120140874982010"}] 这个请求可以换成链接在其他手机跳
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值