主意:输入字符串必须是以'\0'结尾,如果输入字符串没有以'\0'结尾,请手动设置,否则转换会有错误。

unsigned int EncodeUtil::AnsiToUcs2( char* pAnsi, wchar_t*& pUcs2 )
{
  //预转换,得到所需空间的大小
  int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, pAnsi, strlen(pAnsi), NULL, 0);
  //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
  pUcs2 = new wchar_t[wcsLen + 1];
  //转换
  ::MultiByteToWideChar(CP_ACP, NULL, pAnsi, strlen(pAnsi), pUcs2, wcsLen);
  //最后加上'\0'
  pUcs2[wcsLen] = '\0';
  return wcsLen;
}

unsigned int EncodeUtil::Ucs2ToAnsi( wchar_t* pUcs2, char*& pAnsi )
{
  //预转换,得到所需空间的大小,这次用的函数和上面名字相反
  int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, pUcs2, wcslen(pUcs2), NULL, 0, NULL, NULL);
  //同上,分配空间要给'\0'留个空间
  pAnsi = new char[ansiLen + 1];
  //转换
  //unicode版对应的strlen是wcslen
  ::WideCharToMultiByte(CP_ACP, NULL, pUcs2, wcslen(pUcs2), pAnsi, ansiLen, NULL, NULL);
  //最后加上'\0'
  pAnsi[ansiLen] = '\0';
  return ansiLen;
}

unsigned int EncodeUtil::Ucs2ToUtf8( wchar_t* pUcs2, char*& pUtf8 )
{
  //预转换,得到所需空间的大小,这次用的函数和上面名字相反
  int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, pUcs2, wcslen(pUcs2), NULL, 0, NULL, NULL);
  //同上,分配空间要给'\0'留个空间
  //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
  pUtf8 = new char[u8Len + 1];
  //转换
  //unicode版对应的strlen是wcslen
  ::WideCharToMultiByte(CP_UTF8, NULL, pUcs2, wcslen(pUcs2), pUtf8, u8Len, NULL, NULL);
  //最后加上'\0'
  pUtf8[u8Len] = '\0';
  return u8Len;
}

unsigned int EncodeUtil::Utf8ToUcs2( char* pUtf8, wchar_t*& pUcs2 )
{
  //预转换,得到所需空间的大小
  int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, pUtf8, strlen(pUtf8), NULL, 0);
  //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
  pUcs2 = new wchar_t[wcsLen + 1];
  //转换
  ::MultiByteToWideChar(CP_UTF8, NULL, pUtf8, strlen(pUtf8), pUcs2, wcsLen);
  //最后加上'\0'
  pUcs2[wcsLen] = '\0';
  return wcsLen;
}

unsigned int EncodeUtil::AnsiToUtf8( char* pAnsi, char*& pUtf8 )
{
  wchar_t* pUcs2 = NULL;
  AnsiToUcs2(pAnsi, pUcs2);
  unsigned int len = Ucs2ToUtf8(pUcs2, pUtf8);
  delete[] pUcs2;
  return len;
}

Windows下ANSI、Unicode、UTF8字符编码转换的更多相关文章

  1. C语言 windows下Ansi和UTF-8编码格式的转换

    当我们使用MinGW-w64作为编译器在windows系统环境下进行C语言编程时,如果源代码文件(.c)保存格式为Ansi格式,则在打印汉字时不会出现乱码:反之,如果我们使用UTF-8格式保存,则会出 ...

  2. windows下vim编辑器,字符编码设置。

    在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码    set encoding= ...

  3. 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK)

    一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's go! ...

  4. ASCII,Unicode,GBK和UTF-8字符编码的区别和联系

    如果经常写python2,肯定会遇到各种“奇怪”的字符编码问题,每次都通过谷歌解决了,但是为什么会造成这种乱码.decode/encode失败等等,本文就字符和字符编码做一个总结,更加清晰区分诸多的编 ...

  5. ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)

    ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...

  6. php字符编码转换之gb2312转为utf8(转)

    在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...

  7. iconv字符编码转换

    转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...

  8. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

  9. 【转】Unicode utf8等编码类型的原理

    原文地址http://www.cnblogs.com/daxiong2014/p/4768681.html Unicode utf8等编码类型的原理 1.ASCII码  我们知道,在计算机内部,所有的 ...

随机推荐

  1. HW2.23

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. (Step by Step)How to setup IP Phone Server(VoIP Server) for free.

    You must have heard about IP Phone and SIP (Software IP Phone).Nowadays standard PSTN phone are bein ...

  3. PC-用Windows XP自带的组策略加固操作系统

    1.我的壁纸你别改==================================== 启动组策略时,单击“开始”按钮,选择“运行”命令,在“运行”文本框中输入“gpedit.msc”命令,即可启 ...

  4. js关键字

    这已经是我第二次遇到这个问题了..关于关键字,用来做函数的命名,,,在高清上没问题,标清上秒死...页面都出不来...wtf...做个记录.. js关键字http://www.itxueyuan.or ...

  5. opencv数据结构-MAT结构详解

    1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...

  6. 获取datagrid中编辑列combobox的value值与text值

    var ed = $('#dg').datagrid('getEditor', {index:editIndex,field:'productid'}); var productname = $(ed ...

  7. PetShop 4.0学习笔记:消息队列MSMQ

    直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...

  8. SQL Server2000企业管理器在Win7中新建表错误的解决方法

    Sql Server2000建表错误与解决方法: 在Windwos7中SQL Server 2000企业管理器在新建表时会提示错误,尝试各种方法均告无效,包括升级SP3和SP4,最终发现如下规律可以暂 ...

  9. .ssh 文件夹权限设置问题

    .ssh 文件夹权限 问题 今天遇到了 关于.ssh 文件夹夹 设置什么权限合适问题 :答案是 700 chmod 700 .ssh

  10. Android(java)学习笔记140:SpannableString类的使用

    我们之前说过了我们想实现在TextView组件之中,可以显示URL.Email等特殊信息,这些信息点击可以实现跳转,真正意义上的超链接 要实现上面的需求就要SpannableString这个类. 因为 ...