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的更多相关文章
- BCB:UTF8Encode、AnsiToUtf8
UTF8Encode: Call Utf8Encode to convert a Unicode string to UTF-8. WS is the Unicode string to conver ...
- Lazarus 字符集转换 Utf8ToAnsi,UTF8ToWinCP,UTF8ToSys,UTF8ToConsole
由于Lazarus从1.2版开始默认字符集就是UTF8,如果要转到系统正常显示或文本保存,就必须对字符集进行转换.Lazarus提供了很多函数.如题. 那么这里面有什么关系呢? UTF8ToSys 需 ...
- Delphi 解决Utf8ToAnsi和Utf8DeCode转换编码为空的问题
//delphi DecodeUtf8Str解决系统自带UTF8解码缺陷 function DecodeUtf8Str(const S: UTF8String): WideString; var le ...
- mysql中文坑爹的东西
1.首先pb需要utf8格式,所以由ansi转换成utf8格式才能传输 2.在接收端,需要将utf8转换成ansi才能用 3.在插入数据库之前需要将sql从ansi转换成utf8格式 4.数据库设置字 ...
- phprpc 使用实例(例实没错却不能执行)函数冲突gzdecode
PHPRPC 是一个轻型的.安全的.跨网际的.跨语言的.跨平台的.跨环境的.跨域的.支持复杂对象传输的.支持引用参数传递的.支持内容输出重定向的.支持分级错误处理的.支持会话的.面向服务的高性能远程过 ...
- delphi的UTF8相关函数
delphi的UTF8相关函数 AnsiToUtf8 function Converts a string encoded in Ansi to UTF-8. PUCS4Chars function ...
- Lazarus解决含中文文件名或路径的使用问题
其实用lazarus很久(也不算久啦..),目前打算做完手头的最后一个小程序然后就转向c#窗体程序..之前用lazarus的时候出了很多问题,资料也不是很好找,所以这回把比较容易说的记下来省得忘掉 ...
- Delphi读写UTF-8、Unicode格式文本文件
// UTF-8文件写入函数procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True); ...
- phprpc 使用实例(同时有Java、Android和Delphi客户端的例子)
PHPRPC 是一个轻型的.安全的.跨网际的.跨语言的.跨平台的.跨环境的.跨域的.支持复杂对象传输的.支持引用参数传递的.支持内容输出重定向的.支持分级错误处理的.支持会话的.面向服务的高性能远程过 ...
随机推荐
- jms学习笔记
https://www.cnblogs.com/zhuxiaojie/p/5564187.html //创建一个session //第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jm ...
- View可以设置tag携带数据
View可以设置tag携带数据. 例子 初始化:ImageView iv_brand2 设置:iv_brand2.setTag(strB ...
- 七:python 对象类型详解三:列表
一:列表简介: 1,列表可以包含任何种类的对象:数字.字符串甚至集合对象类型.列表都是可变对象,它们都支持在原处修改的操作,可以通过指定的偏移量和分片.列表方法调用.删除语句等方法来实现.关键的作用有 ...
- http://www.bugku.com:Bugku——变量1(http://120.24.86.145:8004/index1.php)
之前立志做出需要编码解决和时间相关的那道CTF题目,但是这次没找到,相关人士找到了麻烦告诉我一声.本次再学习一下子关于正则表达式和PHP的相关知识.开课咯-.- 刚看题目就发现提示, ...
- stm32中adc的常规通道和注入通道的区别
STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换.STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换. 有2种划 ...
- Python: 浅淡Python中的属性(property)
起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...
- netty 之 传统的阻塞io 体系回顾
io 体系回顾: 流的概念: java 程序 通过流来进行完成输入与输出的.流是生产或者消费信息的抽象,流通过java 的 输入/输出系统与物理设备相连,尽管与他们链接的物理设备不尽相同,所有流的行为 ...
- Bootstrap(5)栅格系统
一.移动设备优先 在 HTML5 的项目中,我们做了移动端的项目.它有一份非常重要的 meta,用于设置屏幕和设备等宽以及是否运行用户缩放,及缩放比例的问题. //分别为:屏幕宽度和设备一致.初始缩放 ...
- windows核心编程
第一章 函数返回值: void:不可能失败.极少数会返回VOID BOOL:失败返回0 HANDLE:失败会返回NULL 或INVALID_HANDLE_VALUE PVOID:失败返回NULL wa ...
- HTML转义字符 Unicode和CSS伪类介绍
CSS 伪类用于向某些选择器添加特殊的效果. a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ ...