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表里是倒序排列的,而且只预留了这四个年号, ...
随机推荐
- NFV技术中遇到的新名词
NUMA topology:Non-Uniform Memory Access (NUMA) is a computer system architecture that is used with m ...
- C# 类成员备忘
隐藏基类的方法 调用重写或隐藏的基类方法 嵌套的类型定义 隐藏基类的方法 当从基类继承一个(非抽象)成员时,也就继承了其实现的代码,如果继承的成员是虚拟的,就可以用Overrid重写这段实现代码, 无 ...
- 无IDE时编译和运行Java
最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...
- shell脚本监控MySQL服务是否正常
监控MySQL服务是否正常,通常的思路为:检查3306端口是否启动,ps查看mysqld进程是否启动,命令行登录mysql执行语句返回结果,php或jsp程序检测(需要开发人员开发程序)等等: 方法1 ...
- nyoj925_国王的烦恼_并查集
国王的烦恼 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能 ...
- 收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
查看网址:http://www.open-open.com/lib/view/open1411443332703.html
- php生成对象的研究
<?php abstract class E{ protected $name; function __construct($name){ $this->name = $name; } a ...
- Hibernate查询语句
1 hql查询 Hibernate的查询语句,hiberante提供的面向对象的查询语言,和sql语句的语法的相似.而且严格区分大小写. 1.1 from字句 /** * hql: from 字句 * ...
- supersr--NSURLConnection iOS2.0苹果原生请求
get请求1: NSURL*url = [NSURLURLWithString:@"http://127.0.0.1/demo.json"]; NSURLRequ ...
- Linux定时任务设定
使用crontab 命令进行设定. 详情可参见:http://blog.csdn.net/xiyuan1999/article/details/8160977. 共有6项构成,前5项为时间:分 时 天 ...