AnsiToUtf8 和 Utf8ToAnsi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AnsiToUtf8 和 Utf8ToAnsi相关的知识,希望对你有一定的参考价值。

在服务端数据库的处理当中,涉及中文字符的结构体字段,需要转为Utf8后再存储到表项中。
从数据库中取出包含中文字符的字段后,如果需要保存到char *类型的结构体成员中,需要转为Ansi后再保存。
从数据库中取出类型数字的字段后,如果需要保存到int型的结构体成员中,需要调用atoi函数进行处理后再保存。

1 static char *AnsiToUtf8(char *pchAnsi)
  2 {
  3     int uSize=0;
  4     WCHAR *pwText =NULL;
  5     char *pchUtf8=NULL;
  6     int nUtf8Len = 0;
  7 
  8     if(NULL == pchAnsi)
  9     {
 10         return NULL;
 11     }
 12 
 13     do 
 14     {
 15         uSize = MultiByteToWideChar(CP_ACP,0,pchAnsi,-1,NULL,0);
 16         if(uSize <=0)
 17         {
 18             break;
 19         }
 20         pwText = (wchar_t*)malloc((uSize+1)*sizeof(wchar_t));
 21         if(!pwText)
 22         {
 23             break;
 24         }
 25 
 26         memset((void*)pwText,0,sizeof(wchar_t)*(uSize+1));
 27         MultiByteToWideChar(CP_ACP,0,pchAnsi,-1,pwText,uSize);
 28 
 29         //widechar to utf8
 30         nUtf8Len = WideCharToMultiByte(CP_UTF8, 0, pwText, -1, NULL, 0, NULL, NULL);
 31         if (0 >= nUtf8Len)
 32         {
 33             break;
 34         }
 35 
 36         pchUtf8=(char *)malloc(nUtf8Len+2);
 37         if(NULL == pchUtf8)
 38         {
 39             break;
 40         }
 41         memset(pchUtf8,0,nUtf8Len+2);
 42 
 43         nUtf8Len = WideCharToMultiByte(CP_UTF8, 0, pwText, -1, pchUtf8, nUtf8Len, NULL, NULL);
 44         if (0 >= nUtf8Len)
 45         {
 46             free(pchUtf8);
 47             pchUtf8 = NULL;
 48             break;
 49         }
 50 
 51 
 52     } while (0);
 53 
 54     if(NULL!=pwText)
 55     {
 56         free(pwText);
 57     }
 58 
 59     return pchUtf8;
 60 }
 61 
 62 static char *Utf8ToAnsi(char *pchUtf8)
 63 {
 64     int uSize=0;
 65     WCHAR *pwText =NULL;
 66     char *pchAnsic=NULL;
 67     int ansicStrLen = 0;
 68 
 69     if(NULL == pchUtf8)
 70     {
 71         return NULL;
 72     }
 73 
 74     do 
 75     {
 76         uSize = MultiByteToWideChar(CP_UTF8,0,pchUtf8,-1,NULL,0);
 77         if(uSize <=0)
 78         {
 79             break;
 80         }
 81         pwText = (wchar_t*)malloc((uSize+1)*sizeof(wchar_t));
 82         if(!pwText)
 83         {
 84             break;
 85         }
 86         memset((void*)pwText,0,sizeof(wchar_t)*(uSize+1));
 87         MultiByteToWideChar(CP_UTF8,0,pchUtf8,-1,pwText,uSize);
 88 
 89         //widechar to utf8
 90         ansicStrLen = WideCharToMultiByte(CP_ACP, 0, pwText, -1, NULL, 0, NULL, NULL);
 91         if (0 >= ansicStrLen)
 92         {
 93             break;
 94         }
 95 
 96         pchAnsic=(char *)malloc(ansicStrLen+2);
 97         if(NULL == pchAnsic)
 98         {
 99             break;
100         }
101         memset(pchAnsic,0,ansicStrLen+2);
102 
103         ansicStrLen = WideCharToMultiByte(CP_ACP, 0, pwText, -1, pchAnsic, ansicStrLen, NULL, NULL);
104         if (0 >= ansicStrLen)
105         {
106             free(pchAnsic);
107             pchAnsic = NULL;
108             break;
109         }
110 
111     } while (0);
112 
113     if(NULL != pwText)
114     {
115         free(pwText);
116     }
117 
118     return pchAnsic;
119 
120 }

  

以上是关于AnsiToUtf8 和 Utf8ToAnsi的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 对应JAVA的BASE64位加密处理

如何在 Delphi 中使用 TXMLDocument 将 Ansi 转换为 UTF 8

delphi7 用 idhttp.get 抓取网页显示乱码

Delphi2010(MySQL5)写入UTF8文本的问题

本机代码、机器代码和汇编代码有啥区别?

托管代码和非托管代码