作者:朱金灿

来源:http://blog.csdn.net/clever101

发现开源代码的可利用资源真多,从sqlite3的源码中抠出了几个字符转换接口,稍微改造下了发现还挺好用的。下面是实现代码:

/*
** Convert a UTF-8 string to microsoft unicode (UTF-16?).
**
** Space to hold the returned string is obtained from malloc.
*/
static WCHAR *utf8ToUnicode(const char *zFilename){int nChar;WCHAR *zWideFilename;nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0);zWideFilename = static_cast<WCHAR *>(malloc(nChar*sizeof(zWideFilename[0])));if( zWideFilename==0 ){return 0;}nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar);if( nChar==0 ){free(zWideFilename);zWideFilename = 0;}return zWideFilename;}/*
** Convert microsoft unicode to UTF-8.  Space to hold the returned string is
** obtained from malloc().
*/
static char *unicodeToUtf8(const WCHAR *zWideFilename){int nByte;char *zFilename;nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0);zFilename = static_cast<char*>(malloc( nByte ));if( zFilename==0 ){return 0;}nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte,0, 0);if( nByte == 0 ){free(zFilename);zFilename = 0;}return zFilename;}/*
** Convert an ansi string to microsoft unicode, based on the
** current codepage settings for file apis.
**
** Space to hold the returned string is obtained
** from malloc.
*/
static WCHAR *mbcsToUnicode(const char *zFilename){int nByte;WCHAR *zMbcsFilename;int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR);zMbcsFilename = static_cast<WCHAR*>(malloc( nByte*sizeof(zMbcsFilename[0])));if( zMbcsFilename==0 ){return 0;}nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte);if( nByte==0 ){free(zMbcsFilename);zMbcsFilename = 0;}return zMbcsFilename;}/*
** Convert microsoft unicode to multibyte character string, based on the
** user's Ansi codepage.
**
** Space to hold the returned string is obtained from
** malloc().
*/
static char* unicodeToMbcs(const WCHAR* zWideFilename){int nByte;char *zFilename;int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0);zFilename = static_cast<char*>(malloc(nByte ));if( zFilename==0 ){return 0;}nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte,0, 0);if( nByte == 0 ){free(zFilename);zFilename = 0;}return zFilename;}/*
** Convert multibyte character string to UTF-8.  Space to hold the
** returned string is obtained from malloc().
*/
static char* mbcsToUtf8(const char *zFilename){char *zFilenameUtf8;WCHAR *zTmpWide;zTmpWide = mbcsToUnicode(zFilename);if( zTmpWide==0 ){return 0;}zFilenameUtf8 = unicodeToUtf8(zTmpWide);free(zTmpWide);return zFilenameUtf8;
}/*
** Convert UTF-8 to multibyte character string.  Space to hold the
** returned string is obtained from malloc().
*/
static char* utf8ToMbcs(const char *zFilename){char *zFilenameMbcs;WCHAR* zTmpWide;zTmpWide = utf8ToUnicode(zFilename);if( zTmpWide==0 ){return 0;}zFilenameMbcs = unicodeToMbcs(zTmpWide);free(zTmpWide);return zFilenameMbcs;
}std::string MbcsToUtf8( const char* pszMbcs )
{std::string str;WCHAR   *pwchar=0;CHAR    *pchar=0;int len=0;int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;len=MultiByteToWideChar(codepage, 0, pszMbcs, -1, NULL,0);pwchar=new WCHAR[len];if(pwchar!=0){len = MultiByteToWideChar(codepage, 0, pszMbcs, -1, pwchar, len);if( len!=0 ){len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, 0, 0, 0, 0);pchar=new CHAR[len];if(pchar!=0){len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, pchar, len,0, 0);if(len!=0)                {str = pchar;                   }delete pchar;}delete pwchar;}}return str;
}

要测试这些接口,为此我写了一个测试工程,是读取一个xml文件把里面的字符进行转换的,测试工程的代码下载地址如下:

unicode字符和多字节字符的相互转换接口及测试工程

转载于:https://www.cnblogs.com/lanzhi/p/6469870.html

unicode字符和多字节字符的相互转换接口相关推荐

  1. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  2. mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数

    C语言中的多字节字符与宽字符 字符型char只占八位,存储ascii码的,而宽字符型是为了存储多国语言的代码unicode,包括中文,法语德语什么的,8位256种不够用了 C语言原本是在英文环境中设计 ...

  3. C语言中宽字符和多字节字符

    C 语言原本是在英文环境中设计的,主要的字符集是7 位的ASCII 码.从此开始,8 位的byte(字节)变成最常见的字符编码单位,但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一 ...

  4. linux 宽字符串,C语言中的多字节字符与宽字符

    C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位.但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码. C95 ...

  5. 我的YUV播放器MFC小笔记:unicode编码、宽字符

    以前的MFC工程,字符集都是基于多字节的,而现在这个工程,无意间使用unicode字符集,在其过程中,有诸多函数使用不同于以前.当然,建立项目后也是可以在项目属性中修改字符集的.这篇文章记录一下关 ...

  6. C语言中的多字节字符与宽字符

    C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位.但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码. C95 ...

  7. 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集

    Java中的一个char采用的是Unicode编码集,占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的. 但是在C/C++中由于采用的字符编码集是ASCII, ...

  8. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  9. oracle 括号全角转半角,Oracle 表字段全角字符转换半角字符办法

    如何把oracle表中的全角字符转换为半角字符? a表包含全角字符的字段:address update a set a.address =(to_single_byte(a.address)) 执行, ...

  10. Oracle 表字段全角字符转换半角字符办法

    如何把oracle表中的全角字符转换为半角字符? a表包含全角字符的字段:address update a set a.address =(to_single_byte(a.address))执行,提 ...

最新文章

  1. matlab奈馈斯图,matlab关于控制的设计单位负反馈的校正
  2. 基于Apache Flink的爱奇艺实时计算平台建设实践
  3. 手机QQ浏览器“有码女神”惊现!意在推广二维码
  4. Linux系统优势六大方面
  5. 详解WinCE下USB Host驱动开发(2)
  6. 【SpringBoot】浏览器报错Resource interpreted as Stylesheet but transferred with MIME type text/html
  7. 关于css透明度的问题
  8. (五)Netty之Selector选择器
  9. pla是什么计算机原理,计算机组成原理第05章 中央处理器(2硬布线控制器与PLA控制器).ppt...
  10. STM32串口编程易错点
  11. 青鸟影院售票系统(一)
  12. csgo开发者控制台指令大全_csgo控制台指令大全 csgo控制台命令一览
  13. 腾讯云神图·人脸识别(Face Recognition)常见问题的解答
  14. 《动手学深度学习》(PyTorch版)代码注释 - 32 【RNN_with_zero】
  15. r语言liftchart_最棒的7种R语言数据可视化
  16. 软件自学成才到公司要学历吗_来自7位自学成才的编码人员的经验教训,他们现在全职从事软件开发人员的工作...
  17. 会不会跟着AXIS2上贼船
  18. Google play console 出现意外错误,请稍后重试。 (8869003)
  19. matlab 模块mex,[转载]MATLAB的mex接口
  20. 小学计算机面试说课稿,教师资格面试小学说课稿:科技带给我们什么

热门文章

  1. DBCC--SQLPERF
  2. 用CocoaPods安装ReactiveCocoa遇到的问题
  3. Mac详解:关于macOS 关键的几个文件夹的作用和层级逻辑
  4. TeamViewer 收不到邮件该怎么办?
  5. NTFS for Mac 15如何检查与修复连接的移动磁盘
  6. Solidity基础入门知识---函数的访问权限和可见性
  7. 《拥抱机器人时代——Servo杂志中文精华合集》——3.6 物联网有多么重要
  8. Golang的聊天服务器实践(群聊,广播)(一)
  9. 【Daily Scrum】12-25
  10. varnish运行机制及管理优化