几个多字节和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指向的指针需要释放。

时间: 2024-10-11 00:46:47

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

unicode string和ansi string的转换函数及获取程序运行路径的代码

#pragma once#include <string> namespace stds { class tool { public: std::string ws2s(const std::wstring& ws) { std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs"); const wchar_t* _Sou

宽字符、多字节、unicode、utf-8、gbk编码转化

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号. 而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性.Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通

ascii、unicode、utf、gb等编码详解

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定

Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".

java中的char中unicode和utf的关系

char是Java的基础类型(原类型 ),是字符类型.在Java中字符是基于Unicode编码的,所以一个Java的字符占2个字节,字符的内容存的是unicode的码值(二进制数字).问题来了,程序是怎么把unicode的码值转换为我们要的程序数据?例如:汉字的'汉'对应的unicode码值为:0x6C49.我们想要的程序数据为'汉',而计算机存储的为码值.如何把码值‘0x6c49’显示为‘字’,需要一个转换过程. 这个转换过程需要一个转换规则.转换规则的书面写法为UTF(UCS Transfo

编程中的多字节和Unicode

在编译许多程序的时候,我们常常会出现诸如指针转换错误或者const char[] 不能转换成XX的错误,这时很可能就是项目编码的问题了,如果您使用的是VS编程环境,那么打开工程属性,里面就有个选项是给你选择采用多字符集还是采用unicode.而对于这两者,我坚定不移的喜欢unicode~ 在多字节环境下,系统会按照ASCII字符表中128个字符进行截断操作,由于汉字是占用两个的字节的,所以在即有汉字又有英文的字符串中,该函数只会截断字符串右边英文字符,而对于汉字则无法处理. 而对于Unicode

Unicode 与 UTF 字符标准

Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示.        Unicode用两个字节表示一个字符.前127个字符与ASCII标准一样,前256个字符符合ISO 8859-1标准.                UTF (UCS Transformation Format)提供的 Unicode 字符的表示法对文件系统都是安全的.UTF-8 使用一个字节表示常用的7位ASCII字符,用两个字节表示8位ASCII字符

Unicode 与 UTF

[UCS]   Universal Character Set (通用字符集) [UCS]   Unicode Character Set  (Unicode字符集) [UTF-8]Unicode/UCS Transformation Format-8 说明,由于UTF也适用于编码通用字符集UCS,故亦可称为『UCS transformation formats (UTF)』 Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它是基于通用字符集(Universal Char

UTF-8/UNICODE/简体中文/繁体中文之间的转换

简介 这几天一直在研究中文的简体和繁体之间的转换问题,网上查了一下资料,在此进行整理和备份. 繁体中文有GBK码和BIG5码两种编码,简体中文一般使用的是GB2312编码. 这些编码之间的转换基本都是使用下列3个函数:LCMapString.WideCharToMultiByte和MultiByteToWideChar,其中还会牵涉到UNICODE码和UTF-8码这两种编码. GB2312编码与GBK编码可以直接使用LCMapString转换,GB2312编码/GBK编码与BIG5编码则无法直接