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 }

  

时间: 2024-10-30 15:13:46

AnsiToUtf8 和 Utf8ToAnsi的相关文章

Lazarus 字符集转换 Utf8ToAnsi,UTF8ToWinCP,UTF8ToSys,UTF8ToConsole

由于Lazarus从1.2版开始默认字符集就是UTF8,如果要转到系统正常显示或文本保存,就必须对字符集进行转换.Lazarus提供了很多函数.如题. 那么这里面有什么关系呢? UTF8ToSys 需要 启用编译参数 –dDisableUTF8RTL,否则还是UTF8,如果变码还是Utf8ToAnsi,但做了基本的处理. 对应代码 function UTF8ToSys(const s: string): string; begin {$IFDEF UTF8_RTL} Result:=s; {$E

C语言字符集转换

#include "codechange.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>#include <locale.h> wchar_t *ANSITOUnicode(const char* str){    int textlen = 0;    wchar_t *result = NULL;    textl

字符串转换

wchar_t *ANSITOUnicode(const char* str){ int textlen = 0; wchar_t *result = NULL; textlen = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0); result = (wchar_t*)malloc((textlen+1)*sizeof(wchar_t)); memset(result,0,(textlen+1)*sizeof(wchar_t)); MultiByteTo

Delphi读写UTF-8、Unicode格式文本文件

// UTF-8文件写入函数procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True);var  MemStream: TMemoryStream;  HeaderStr: String;begin  if S = '' then Exit; MemStream := TMemoryStream.Create;  try    if WriteHeader then    begin 

解决Delphi7的自带的UTF-8编码转换函数BUG

Delphi7及其以下版本的 VCL 只支持 Ansi, 所以... WideString 与 UTF8String (定义与 AnsiString 相同) 并没有办法正确的在 VCL 中显示 Delphi7自带的utf-8转换函数遇到其无法识别的字符串就返回空. 用以下转换函数可以解决这个bug unit util_utf8; interface uses Windows; type UTF8String = AnsiString; function AnsiToWide(const S: A

读写UTF-8、Unicode文件(加上了文件头,貌似挺好用)

conf配置文件一些为UTF-8和Unicode格式,这样便可良好的支持多语言,从网上查阅资料后,将读写UTF-8.Unicode文件写了几个最精简的函数,更新后加了是否写文件头的功能,以适应更多需要,注意函数未加防错保护. 参数说明:f文件名.s写入或读取的文件内容.hs文件头.b是否读写文件头. UTF-8文件写入函数 代码 procedure SaveUTF(f:string;s:string;b:boolean=true);var  ms:TMemoryStream;  hs:Strin

几个多字节和UNICODE及UTF-8之间相互转化的函数

做vc++开发免不了多字节UNICODE.UTF-8转来转去,下面贴出我写的几个字符转化函数 1. TCHAR  和CHAR转化, TCHAR 对应UNICODE和多字节下分别是WCHAR 和CHAR 函数如下: 需要注意*dest是new出来的需要释放 //char 字符串转化为tchar字符串 void C2T(TCHAR** dest, const char* src) { #ifdef _UNICODE if (src == NULL) { return ; } size_t alen

字符串处理 - ANSI - Unicode - UTF8 转换

#include <stdio.h> #include <windows.h> #include <locale.h> #define BUFF_SIZE 1024 wchar_t * ANSIToUnicode( const char* str ) { int textlen ; wchar_t * result; textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 ); result = (wchar_t

phprpc 使用实例(例实没错却不能执行)函数冲突gzdecode

PHPRPC 是一个轻型的.安全的.跨网际的.跨语言的.跨平台的.跨环境的.跨域的.支持复杂对象传输的.支持引用参数传递的.支持内容输出重定向的.支持分级错误处理的.支持会话的.面向服务的高性能远程过程调用协议. 遇到的问题总结: Fatal error: Cannot redeclare gzdecode() in1.重命名compat.php.phprpc_client.php的gzdecode(和系统函数冲突)函数为gzdecode_other Non-static method PHPR