做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之间相互转化的函数相关推荐

  1. ASCII Unicode GBK UTF的联系

    快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char和nchar,那个n据说是指unicode的数据,这个是什么意思." 并不是所有简单的问题都很 ...

  2. C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转

    C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...

  3. c语言字符集改为多字节,多字节与Unicode

    编码知识 一.Unicode与多字节(ANSI ) (1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性> ...

  4. GB2312和BIG5,Unicode/UTF8等编码之间的互相转化

    在工作中经常会用到GB2312和BIG5,Unicode/UTF8等编码之间的互相转化,也有很多程序员对这个问题不断的提问,现在我把我的 实现告诉大家. #include "Utf8.h&q ...

  5. Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码

    将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...

  6. Unicode、UTF-8 和 ISO8859-1到底有什么区别(转载)

    本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 c ...

  7. 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别

    ASCII编码(American Standard Code for Information Interchange,美国信息互换标准代码),使用127个8进制字节表示英文和半角字符. GBK (Gu ...

  8. VS编译器中的字符集(多字节和Unicode)的区别

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  9. unicode、utf区别

    字符集 首先,我们要明确2个概念,字符集和字符编码. 字符集:ASCII.GB2312.GBK.Unicode 字符编码:UTF-8.UTF-16.UTF-32 由于ASCII.GB2312.GBK不 ...

最新文章

  1. 【LeetCode】Palindrome Number(回文数)
  2. 「镁客早报」任正非称对苹果等对手出售5G芯片持开放态度;马斯克称未来12个月内将生产超过50万辆车...
  3. php静态函数作用,php – OOP中静态函数有什么用?
  4. javascript+HTML+CSS面试题
  5. python数据分析实例_Python数据分析及可视化实例之爬虫源码(05)
  6. 代码仓库-SVN分支策略
  7. Java旅游网站源码+页面
  8. html图标隐藏,教你如何隐藏统计图标,两个隐藏统计图标的HTML代码
  9. ms vc9 php,php连接sql server数据库库
  10. 2022-2028年中国林业碳汇行业市场发展规模及投资机会分析报告
  11. 图文讲解uni-app支持PC宽屏
  12. 图像运算和图像增强一
  13. 北理工大学计算机专硕学硕,计算机2年制专硕越来越少,生活终于对我下手了吗?...
  14. sql(Mysql)查询出时间数据在显示时加上时区
  15. c51单片机c语言取反运算符,单片机c语言教程:C51运算符和表达式
  16. 力天创见客流工程实施
  17. 软件测试行业还能干多久?35岁真的会直接淘汰吗?
  18. ps -aux ps -ef 命令
  19. 使用Matlab软件对NDVI进行最大值合成
  20. 【Python】pyserial module sends hex style byte data to embedd system

热门文章

  1. 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
  2. AI实战 | Tensorflow自定义数据集和迁移学习(附代码下载)
  3. NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项
  4. 使用Notepad++作为Latex编辑器
  5. mysql slave修改_MySql主从复制(初学笔记)
  6. 多个vue项目合并成一个_再见Vlookup,合并多个表格发现一个最简单方法
  7. gorm软删除_gorm 的预加载怎么才能关掉软删除-问答-阿里云开发者社区-阿里云
  8. oozie mysql_【oozie】将oozie的数据库配置为mysql | 学步园
  9. 扑捉和捕捉的区别照相_扑捉和捕捉的区别照相
  10. python链表结构_CodeSalt | Python数据结构的实现 — 链表