VC++中字符串编码的转换
在以前VC++6.0中默认的字符集是多字节字符集(MBCS:Multi-Byte Character Set),而VS2005及以后默认的字符集是Unicode,这样导致以前在VC6.0中非常简单实用的各类字符操作和函数在VS2010环境下运行时会报各种各样的错误。
字符集可以通过工程属性修改:“工程-属性-字符集”。
CString在Unicode和多字节字符集下的区别:CString 是基于 TCHAR 数据类型的。如果为程序的生成定义了符号 _UNICODE,则会将 TCHAR 定义为 wchar_t 类型(一个 16 位的字符编码类型);否则,会将它定义为 char(普通的 8 位字符编码)。于是,在 Unicode 下,CString 由 16 位字符组成。如果没有 Unicode,它们则由 char 类型的字符组成(来自MSDN)。
以下是CString在Visual C++ .NET 2010环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。
1.Unicode下CString转换为char *
方法一: 使用API:WideCharToMultiByte进行转换
CString str = _T("你好,世界!Hello,World");
//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength();
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP,,str,str.GetLength(),NULL,,NULL,NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * pFileName = new char[len+]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP,,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+] = ‘\‘; //多字节字符以’\0′结束
方法二:使用函数:T2A、W2A
CString str = _T("你好,世界!Hello,World");
//声明标识符
USES_CONVERSION;
//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
char * pFileName = T2A(str);
//char * pFileName = W2A(str); //也可实现转换
2、Unicode下char *转换为CString
方法一:使用API:MultiByteToWideChar进行转换
char * pFileName = "你好,世界!Hello,World";
//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(pFileName);
//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP,,pFileName,charLen,NULL,);
//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + ];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,,pFileName,charLen,buf,len);
buf[len] = ‘\‘; //添加字符串结尾,注意不是len+1
//将TCHAR数组转换为CString
CString pWideChar;
pWideChar.Append(buf);
//删除缓冲区
delete []buf;
方法二:使用函数:A2T、A2W
char * pFileName = "你好,世界!Hello,World";
USES_CONVERSION;
CString s = A2T(pFileName);
//CString s = A2W(pFileName);
下面是在网上看到的转换代码,注意函数MultiByteToWideChar()和WideCharToMultiByte()第四个参数传入-1时表示第三个参数传入的字符串是null结尾的(null-terminated),这时候返回的字节数(字符数)就包含了null,详情看MSDN。
#include "stdafx.h" #include <windows.h>
#include <iostream>
#include <vector>
#include <atlstr.h> using namespace std; std::wstring UT2WC(const char* buf)
{
int len = MultiByteToWideChar(CP_UTF8, , buf, -, NULL, );
std::vector<wchar_t> unicode(len);
MultiByteToWideChar(CP_UTF8, , buf, -, &unicode[], len);
return std::wstring(&unicode[]);
} std::string WC2UT(const wchar_t* buf)
{
int len = WideCharToMultiByte(CP_UTF8, , buf, -, NULL, , NULL, NULL);
std::vector<char> utf8(len);
WideCharToMultiByte(CP_UTF8, , buf, -, &utf8[], len, NULL, NULL);
return std::string(&utf8[]);
} std::wstring MB2WC(const char* buf)
{
int len = MultiByteToWideChar(CP_ACP, , buf, -, NULL, );
std::vector<wchar_t> unicode(len);
MultiByteToWideChar(CP_ACP, , buf, -, &unicode[], len);
return std::wstring(&unicode[]);
} std::string WC2MB(const wchar_t* buf)
{
int len = WideCharToMultiByte(CP_ACP, , buf, -, NULL, , NULL, NULL);
std::vector<char> utf8(len);
WideCharToMultiByte(CP_ACP, , buf, -, &utf8[], len, NULL, NULL);
return std::string(&utf8[]);
} int main()
{
setlocale(LC_ALL, "");
CString str = "UNICODE转换成UTF-8";
//cout << WC2UT(str).c_str() << endl; //Unicode下
BSTR bstr = str.AllocSysString();
cout << WC2UT(bstr).c_str() << endl; //多字符集下/Unicode下 std::string s = WC2UT(bstr);
SysFreeString(bstr);
std::wstring ws = UT2WC(s.c_str());
wcout<< ws.c_str() << endl; const wchar_t* s1 = L"UNICODE转换成UTF-8";
cout << WC2UT(s1).c_str() << endl; const char* s2 = "ANSI转换成UNICODE";
wcout << MB2WC(s2).c_str() << endl; const wchar_t* s3 = L"UNICODE转换成ANSI";
cout << WC2MB(s3).c_str() << endl; return ;
}
参考:
http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.80).aspx
WideCharToMultiByte:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
MultiByteToWideChar:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx
VC++中字符串编码的转换的更多相关文章
- VC++中字符串编码处理的一些相关问题
前言 什么是tchar? 百度百科对其的定义如下": 因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包 ...
- 一篇文章助你理解Python2中字符串编码问题
前几天给大家介绍了unicode编码和utf-8编码的理论知识,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系.下面在Python2环境中进行代码演示,分别Wind ...
- 一篇文章助你理解Python3中字符串编码问题
前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...
- VC++ 中使用 std::string 转换字符串编码
目录 第1章说明 1 1.1 代码 1 1.2 使用 4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...
- python中字符串编码转换
字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...
- java中字符串编码转换
Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...
- PHP 字符串编码的转换
原文链接:http://mangguo.org/php-string-encoding-convert-and-detect/ GBK 和 UTF-8 编码的转换是一个非常恶心的事情,比如像 PHP ...
- 【转载】Perl中字符串编码的处理
在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...
- 使用Word 进行UTF8 以及字符串编码的转换操作
1. 使用Word文档能够实现 字符串和utf8编码的转换. 快捷键是 ALT+X 在知乎的一个里面看到一个说法: ㍾ ㍽ ㍼ ㍻ - 这四个在Unicode表里是倒序排列的,而且只预留了这四个年号, ...
随机推荐
- $.extend() 或 jQuery.extend() 与 $.fn.Xxx 或 jQuery.fn.extend(object) 之jQuery插件开发
jQuery为开发插件提拱了两个方法 语法现象1:$.extend() 或 jQuery.extend() 或 jQuery.extend(object)//可以理解为为jQuery类添加类方法或静态 ...
- HTK学习2:工具使用
选自:http://www.cnblogs.com/mingzhao810/archive/2012/08/03/2617674.html 这个是重点,呵呵,本部分会讨论到如下内容: 1. 建立语音材 ...
- 获取shell脚本自身所在目录的Shell脚本分享
前几天写的七牛的参赛demo,用bash写了一个便捷安装的脚本,涉及到了路径相关的判断,从stackoverflow,加上自己的实践整理一下. 简单版 下面是一个最简单的实现,可以解决大多数问题,缺陷 ...
- Git是如何存储对象的
原文:http://gitbook.liuhui998.com/7_1.html 一.前言 所有的对象都以SHA值为索引用gzip格式压缩存储, 每个对象都包含了对象类型, 大小和内容. Git中存在 ...
- Strobogrammatic Number
Strobogrammatic Number I A strobogrammatic number is a number that looks the same when rotated 180 d ...
- Mybatis中的in查询和foreach标签
Mybatis中的foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separato ...
- Windows下安装Maven
上篇文章刚说到Linux下安装maven的过程,有时候为了适合在本地构建项目开发,然后上传到远程服务器执行,需要在本地构建maven项目,那么一般就是在Windows下构建maven项目并导入到我们的 ...
- Angular中使用Rainbow
在使用js类库和框架的时候,大家都习惯于编写自己的使用示例,如果能将示例中的html,js和css 进行展示, 并进行高亮显示,效果会很棒,例如在html高亮显示jquery代码 上面的示例是使用ra ...
- nyoj138 找球号(二)_离散化
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i< ...
- nohup后台运行jar
nohup 用途:LINUX命令用法,不挂断地运行命令. 语法:nohup Command [ Arg ... ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关 ...