几个多字节和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 = strlen(src) + 1;
size_t ulen = (size_t)MultiByteToWideChar(CP_ACP, 0, src,alen,NULL, 0 )+1;*dest = new WCHAR[ulen];
::MultiByteToWideChar(CP_ACP, 0, src, alen, *dest, ulen);
#else
//多字节TCHAR就是 char
int len = strlen(src)+1;
*dest = new char[len];
strcpy(*dest, src);
#endif
}
复制代码
2、TCHAR转化为多字节,同样要注意*dest指针释放
复制代码
void T2C(char** dest, const TCHAR* src)
{
if(src == NULL)
return ;
#ifdef _UNICODE
size_t len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0 , NULL, NULL);
if (len == 0)
{
return;
}
*dest = new char[len];
WideCharToMultiByte( CP_ACP, 0, src, -1, *dest, len, NULL, NULL );
#else
int len = _tcslen(src) + 1;
*dest = new TCHAR[len];
strcpy(*dest, src);
#endif
}
复制代码
3、下面两个函数跟上面的有点重复但是后面会用到,也贴出来
复制代码
//多字节转化为宽字节
void C2W(WCHAR** dest, const char* src)
{
if (src == NULL)
{
return ;
}
size_t alen = strlen(src) + 1;
size_t ulen = (size_t)MultiByteToWideChar(CP_ACP, 0, src,alen,NULL, 0 )+1;*dest = new WCHAR[ulen];
::MultiByteToWideChar(CP_ACP, 0, src, alen, *dest, ulen);
}
//宽字节转化为多字节
void W2C(char** dest, const WCHAR *src)
{
if(src == NULL)
return ;
size_t len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0 , NULL, NULL);
if (len == 0)
{
return;
}
*dest = new char[len];
WideCharToMultiByte( CP_ACP, 0, src, -1, *dest, len, NULL, NULL );
}
复制代码
4、UTF-8和多字节及宽字节之间的转化
复制代码
//UNICODE可以直接转化为UTF-8
void UnicodeToUtf8(char** dest , const WCHAR* src)
{
ASSERT(dest!= NULL || src != NULL);
int len = -1;
len = WideCharToMultiByte(CP_UTF8, 0, src, -1, 0, 0, 0, 0)+1;
*dest = new char[len+1];
::WideCharToMultiByte(CP_UTF8, 0, src, -1,*dest, len, 0, 0);
}
//多字节要先转化为宽字节在转化为UTF-8
void AnsiToUtf8(char** dest, const char* src)
{
ASSERT(dest!= NULL || src != NULL);
WCHAR* pwszStr = NULL;
C2W(&pwszStr, src);
UnicodeToUtf8(dest, pwszStr);
SAFE_ARRYDELETE(pwszStr);
}
复制代码
UTF-8转化为多字节或者UNICODE:
复制代码
void Utf8ToAnsi(char** dest, const char* src)
{
ASSERT(dest!= NULL || src != NULL);
WCHAR* str = NULL;
Utf8ToUnicode(&str, src);
W2C(dest, str);
SAFE_ARRYDELETE(str);
}
void Utf8ToUnicode(WCHAR** dest,const char* src)
{
ASSERT(dest!= NULL || src != NULL);
int unicodeLen = ::MultiByteToWideChar( CP_UTF8, 0, src, -1, NULL, 0 ) + 1;
*dest = new WCHAR[unicodeLen];
//memset(*dest, 0x0, (unicodeLen + 1)*sizeof(WCHAR));
MultiByteToWideChar(CP_UTF8, 0, src, -1, *dest, unicodeLen);
}
复制代码
SAFE_ARRYDELETE是一个内存是释放宏如下
#define SAFE_ARRYDELETE(x) if(NULL!=x){delete[] x;x = NULL;}
#define SAFE_DELETE(x) if(NULL!=x){delete x; x =NULL;}
有了以上函数基本上不同编码间可以随意转,大家也还可以对以上这些函数尽心扩展,需要注意的是上面这些函数中dest指向的指针需要释放。
几个多字节和UNICODE及UTF-8之间相互转化的函数相关推荐
- ASCII Unicode GBK UTF的联系
快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char和nchar,那个n据说是指unicode的数据,这个是什么意思." 并不是所有简单的问题都很 ...
- C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转
C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...
- c语言字符集改为多字节,多字节与Unicode
编码知识 一.Unicode与多字节(ANSI ) (1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性> ...
- GB2312和BIG5,Unicode/UTF8等编码之间的互相转化
在工作中经常会用到GB2312和BIG5,Unicode/UTF8等编码之间的互相转化,也有很多程序员对这个问题不断的提问,现在我把我的 实现告诉大家. #include "Utf8.h&q ...
- Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...
- Unicode、UTF-8 和 ISO8859-1到底有什么区别(转载)
本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 c ...
- 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
ASCII编码(American Standard Code for Information Interchange,美国信息互换标准代码),使用127个8进制字节表示英文和半角字符. GBK (Gu ...
- VS编译器中的字符集(多字节和Unicode)的区别
文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...
- unicode、utf区别
字符集 首先,我们要明确2个概念,字符集和字符编码. 字符集:ASCII.GB2312.GBK.Unicode 字符编码:UTF-8.UTF-16.UTF-32 由于ASCII.GB2312.GBK不 ...
最新文章
- 【LeetCode】Palindrome Number(回文数)
- 「镁客早报」任正非称对苹果等对手出售5G芯片持开放态度;马斯克称未来12个月内将生产超过50万辆车...
- php静态函数作用,php – OOP中静态函数有什么用?
- javascript+HTML+CSS面试题
- python数据分析实例_Python数据分析及可视化实例之爬虫源码(05)
- 代码仓库-SVN分支策略
- Java旅游网站源码+页面
- html图标隐藏,教你如何隐藏统计图标,两个隐藏统计图标的HTML代码
- ms vc9 php,php连接sql server数据库库
- 2022-2028年中国林业碳汇行业市场发展规模及投资机会分析报告
- 图文讲解uni-app支持PC宽屏
- 图像运算和图像增强一
- 北理工大学计算机专硕学硕,计算机2年制专硕越来越少,生活终于对我下手了吗?...
- sql(Mysql)查询出时间数据在显示时加上时区
- c51单片机c语言取反运算符,单片机c语言教程:C51运算符和表达式
- 力天创见客流工程实施
- 软件测试行业还能干多久?35岁真的会直接淘汰吗?
- ps -aux ps -ef 命令
- 使用Matlab软件对NDVI进行最大值合成
- 【Python】pyserial module sends hex style byte data to embedd system
热门文章
- 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
- AI实战 | Tensorflow自定义数据集和迁移学习(附代码下载)
- NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项
- 使用Notepad++作为Latex编辑器
- mysql slave修改_MySql主从复制(初学笔记)
- 多个vue项目合并成一个_再见Vlookup,合并多个表格发现一个最简单方法
- gorm软删除_gorm 的预加载怎么才能关掉软删除-问答-阿里云开发者社区-阿里云
- oozie mysql_【oozie】将oozie的数据库配置为mysql | 学步园
- 扑捉和捕捉的区别照相_扑捉和捕捉的区别照相
- python链表结构_CodeSalt | Python数据结构的实现 — 链表