Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集(DBCS)。

一、相关操作函数

1、DBCS使用下面的函数操作字符串:

CharNext——获得后一个字符

CharPrev——获得前一个字符

IsDBCSLeadByte——判断是否为两个字节字符的第一个字节

C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。

2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。

3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。

二、对应的数据类型

1、对于ANSI字符定义为char     多字符

2、对于Unicode的字符定义为wchar_t     宽字符

三、使用环境

1、首先要说明的是Win98对于Unicode的支持是很微弱的,所以如果要在Win98上运行Unicode编译的程序,可能造成运行错误或者失败。

2、 由于Win2000及以后的OS的内核都是使用Unicode编写的,所以虽然可以在其上运行ANSI编码的程序,但是其运行过程中很多地方都需要将 ANSI转换为Unicode以后,调用Unicode版本的函数,因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用 Unicode编写程序。

四、编写通用的程序

1、在编程的时候使用TCHAR数据类型,此类型能够根据预编译宏的定义,将其转换为ANSI或者是Unicode。

2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏,TCHAR将转换为wchar_t。

3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。

4、_UNICODE宏用于C运行期库的头文件,UNICODE宏用于Windows头文件。一般同时定义这两个宏。

五、转换函数

1、ANSI转换为Unicode使用:MultiByteToWideChar。

函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。

函数原型:

int MultiByteToWideChar(

UINT CodePage,

DWORD dwFlags,

LPCSTR lpMultiByteStr,

int cchMultiByte,

LPWSTR lpWideCharStr,

int cchWideChar

);

CodePage:指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。你也可以指定其为下面的任意一值:

CP_ACP:ANSI字符集;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;

CP_SYMBOL:符号字符集(42);CP_THREAD_ACP:当前线程ANSI代码页;

CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换。

dwFlags:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。你可以指定下面是标记常量的组合,含义如下:

MB_PRECOMPOSED:通常使用预作字符--就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与

MB_COMPOSITE值一起使用。

MB_COMPOSITE:通常使用组合字符--就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。不能与MB_PRECOMPOSED值一起使用。

MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。

MB_USEGLYPHCHARS:使用象形文字替代控制字符。

组合字符由一个基础字符和一个非空字符构成,每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符è中,e就是基础字符,而重音符标记就是非空字符。

函数的缺省动作是转换成预作的形式。如果预作的形式不存在,函数将尝试转换成组合形式。

标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。

lpMultiByteStr:指向将被转换字符串的字符。

cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。

lpWideCharStr:指向接收被转换字符串的缓冲区。

cchWideChar:指定由参数lpWideCharStr指向的缓冲区的宽字符个数。若此值为零,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。

2、Unicode转换为ANSI使用:WideCharToMultiByte。

WideCharToMultiByte( 0, // specify the code page used to perform the conversion

0,         // no special flags to handle unmapped characters

pwstr,     // wide character string to convert

nlength,   // the number of wide characters in that string

NULL,      // no output buffer given, we just want to know how long it needs to be

0,

NULL,      // no replacement character given

NULL );    // we don't want to know if a character didn't make it through the translation

宽字符转多字符:

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );

多字符转宽字符:

size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );

下面是字符转换代码:

1.  wchar_t   转换为 char

char* WcharToChar(const wchar_t* wp)
{char *m_char;int len = WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);m_char = new char[len + 1];WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), m_char, len, NULL, NULL);m_char[len] = '\0';return m_char;
}

2.char 转换为 whar_t

//将char* 转成wchar_t*的实现函数如下://这是把asii字符转换为unicode字符,和上面相同的原理void c2w(wchar_t *pwstr,size_t len,const char *str){if(str){size_t nu = strlen(str);size_t n =(size_t)multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,null,0);if(n>=len)n=len-1;multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,pwstr,(int)n);pwstr[n]=0;}}

c++ 多字节 转换为 unicode相关推荐

  1. pythonunicode转为字符串_python中将 \\uxxxx转换为 Unicode字符串

    今天碰到一个很有意思的问题,需要将普通的 Unicode字符串转换为 Unicode编码的字符串,如下: 将 \\u9500\\u552e 转化为 \u9500\u552e 也就是 销售 . 乍一看感 ...

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

    做vc++开发免不了多字节UNICODE.UTF-8转来转去,下面贴出我写的几个字符转化函数 1. TCHAR 和CHAR转化, TCHAR 对应UNICODE和多字节下分别是WCHAR 和CHAR ...

  3. 避免Gson使用时将一些字符自动转换为Unicode转义字符

    // 避免Gson使用时将一些字符自动转换为Unicode转义字符 public static Gson gson = new GsonBuilder().disableHtmlEscaping(). ...

  4. VC下几种转换为UNICODE字符串的方法

    在vc6.0的环境下,通常字符是采用ANSI方式进行编码的,而现在很多程序或者应用之间的交互,是需要采用UNICODE字符编码的.比方说使用GDI+或者使用sqlite3的链接.那么VC下有哪些方法, ...

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

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

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

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

  7. java快速替换中文为unicode_利用Java怎么将汉字转换为Unicode码

    利用Java怎么将汉字转换为Unicode码 发布时间:2021-02-20 17:05:17 来源:亿速云 阅读:64 作者:Leah 本篇文章为大家展示了利用Java怎么将汉字转换为Unicode ...

  8. 将汉字转换为Unicode编码vb.net源码

    vb.net中,将汉字转换为Unicode编码过程,参数source为需要转换文字字符串,Hex为Boolean类型,表示需要转为十六进制的,还是十进制的编码字符串. ''' <summary& ...

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

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

  10. oracle中文转换为unicode,oracle 用函数unistr将Oracle数据库中的Unicode转换为中文

    用函数unistr将Oracle数据库中的Unicode转换为中文 1:保留连续的中文 select regexp_substr('Hello,大家好!greeting', '[' || unistr ...

最新文章

  1. XSS编码问题以及绕过
  2. android 获取第三方应用程序包名并启动,android 获取第三方应用程序包名并启动...
  3. ubuntu16.04/20.04 xfce4下面使用护眼软件redshift
  4. Public DNS (公共域名解析服务)
  5. MYSQL互为主从同步(Windows)
  6. FileUpload上传图片提示 “GDI+中发生一般性错误”
  7. HCIE-Security Day4:安全策略和状态检测
  8. redis string底层数据结构
  9. CCF推荐会议/期刊目录(2019)
  10. atmega328p引脚图_atmega328p中文手册
  11. linux 编译chromium,简易编译Chromium OS内核教程
  12. CAD图纸被设置成只读格式,如何取消?
  13. 多服务器显卡使用状态监控工具实现
  14. 如何取消福昕阅读器的手型光标里面的向下的箭头
  15. 2、面向对象的思维(与结构化思维比较)
  16. 资源管理Placement部署(Nova)
  17. cpc按点击计算怎么算_百度竞价CPC点击价格的的计算公式以及出价的原理吗?
  18. 目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)
  19. 网上调研:主流网络技术和设备的性能与市场
  20. pycharm如何恢复工具的主菜单

热门文章

  1. python递归函数基例_函数和代码复用 --Python
  2. wdcp v2.5.15 php版本,linux服务器/虚拟主机管理系统wdcp v2.5.6版本发布
  3. php 获取小数精度,php小数精度问题
  4. java public就是可选吗_java 中的public
  5. 腾讯PCG事业部后台实习开发过经(已拿offer)
  6. 动态规划实战14 leetcode-312. Burst Balloons
  7. python中arcsec_python – 更好的方法来计算Skyfield中两个物体的明显角度分离?
  8. ajax jsonp不触发后台_JsonP
  9. RCP:如何保存TaskList及如何获取TaskList
  10. Linux系统管理——账号管理与权限及归属管理实例