VC++编程之字符串解惑--Unicode & MBCS
VC++中的字符串用起来着实让人难受,LPTSTR、LPCTSTR、LPCSTR、LPCWSTR、LPSTR、WCHAR、CString、_T()和L彼此之间的互相转换更是头痛。根据使用经验和MSDN Libary文档总结出如下:
1.CString类型字符串
CString位于头文件afx.h中,是MFC中的一种字符串类型的类。此处解释CString与LPSTR、LPCSTR相互转换问题。
注:typedef char CHAR; typedef CHAR* LPSTR; typedef CONST CHAR * LPCSTR;
1.1 LPSTR转换成CString
LPSTR lpStr = “TestString”;
CString str(lpStr);
1.2 CString 转换成 LPSTR
方法一:
CString strName("TestString");
LPSTR lpStr = strName.GetBuffer();
strName.ReleaseBuffer();
方法二:
CString strName("TestString");
LPSTR lpStr = (LPSTR)(LPCSTR) strName;
2. LPSTR、LPCSTR、LPWSTR、LPCWSTR、LPTSTR、LPCTSTR详解
首先要补充两个宏的解释:UNICODE和MBCS
MBCS宏对应的字符串指针是char *也就是LPSTR:typedef char * LPSTR
UNICODE宏对应的指针是unsigned·short * 也就是LPWSTR: typedef unsigned·short* LPWSTR
MBCS:
它是多字节字符集,它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因), 但表示其他文字时就需要用多字节。
UNICODE:
它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。
WINDOWS下面的程序设计可以支持MBCS和UNICODE两种编码的字符串,具体用那种就看你定义了MBCS宏还是 UNICODE宏。LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节;
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节;
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义;
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义。
LPSTR
一个指向以’\0’结尾的字符串指针,字符用8位Windows(ANSI)字符表示。更多信息参考“字体使用的字符集”。这种类型在WinNT.h中声明如下:
typedef CHAR* LPSTR;
LPCSTR (WinNT.h)
typedef _nullterminated CONST CHAR * LPCSTR;
补充: wchar_t 是本机类型
如果编译时指定编译参数 /Zc:wchar_t-,编译器就会要求定义wchar_t,或者要求包括定义它的众多头文件中的一个文件(如:wchar.h).wchar_t 通常定义为
typedef unsigned short wchar_t;
编译器通过使用 /Zc:wchar_t 将wchar_t识别为本机类型。有关wchar_t的更多信息,参看MSDN Libary 的Data type Ranges条目。
WCHAR (Esent.h)
The WCHAR data type contains a 16-bit Unicode character.
#if !define(_NATIVE_WCHAR_T_DEFINE)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR; //此处的wchar_t类型大小随机器不同(指机器字长)而不同
#endif
LPWSTR
一个指向以’\0’结尾的字符串的指针,字符用16位Unicode字符集表示。更多信息参考“字体使用的字符集”。这种类型在WinNT.h中声明如下:
typedef WCHAR * LPWSTR;
LPCWSTR
typedef CONST WCHAR * LPCWSTR;
LPCTSTR (WinNT.h)
#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
3. _T() 和 L
_T()一般同字符串相关,如_T("Hello, seeking!");如果你编译一个程序为MBCS方式,_T()实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello" 字符串以UNICODE方式保存。
_T() 和 L 的区别在于,使用L时不管你是以什么方式编译,一律UNICODE方式保存。如:L“Hello!”。其实“L”是来源于C++中对宽字符(Weld Char,比如Unicode字符)的定义,如:wstring wstrName = L"Hello, seeking!";
4.C语言数组和LPCSTR之间的转换
4.1 数组转成LPCSTR(即const char*)
char pchar_pcchar[20]= "pchar_pcchar";
if( typeid(pchar_pcchar)== typeid(char[20]) )
cout<< "char [20]" <<endl;
const char* PCChar=pchar_pcchar; //数组直接可以转成LPCSTR
cout<< PCChar << endl;
输出结果:char [20]
pchar_pcchar
4.2 LPCSTR(即const char*)转成数组(即char*)
Mark20130912:思路还未找到
Mark20131119:一种思路
LPCSTR lpcstr = “long point const string”;
char * arry = (char *) lpcstr;
cout << arry << endl;
VC++编程之字符串解惑--Unicode & MBCS的更多相关文章
- VC++编程中常用的字符串转换函数
VC++编程中经常遇到不同编码编码的字符串之间需要转换的情况,以下简单提供几个不同编码字符串之间的转换函数: ANSI 字符串和Unicode字符串之间的转换 //Convert wide char ...
- windows 编程—— 宽字符集 与 Unicode
目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...
- 将ASCII字符串转换为UNICODE字符串
写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一 ...
- Python3 编程之字符串处理
Python3 编程之字符串处理 在编程中最常见的任务就是字符串的处理,So,学好字符串的使用非常重要 一.变量的定义规范 Python中声明变量时,要符合以下规则为准: 只能使用数字.字母.下划线组 ...
- 【转】VC中的字符串处理
http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727 貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的 ...
- js中 字符串与Unicode 字符值序列的相互转换
一. 字符串转Unicode 字符值序列 var str = "abcdef"; var codeArr = []; for(var i=0;i<str.length;i++ ...
- Python语言总结 4.2. 和字符串(str,unicode等)处理有关的函数
4.2.7. 去除控制字符:removeCtlChr Python语言总结4.2. 和字符串(str,unicode等)处理有关的函数Sidebar Prev | Up | Next4.2.7 ...
- 字符串与Unicode码的相互转换
//1,字符串转换为unicode码 var s = '吴'; //2,unicode码转字符串 '\u5434'.toString(16) //吴 或者 String.fromCharCode(21 ...
- java对含有中文的字符串进行Unicode编码
public class MyUtil { public static void main(String[] args) throws Exception { String s = "a中a ...
随机推荐
- Regex阅读笔记(二)之环视
环视不匹配任何字符,只匹配文本中的特定位置. 正序环视:(?=) 逆序环视:(?<=) 非捕获(?:) 环视会检查子表达式能否匹配,但它只寻找能够匹配的位置,而不会真正占用这些字符. -用在字符 ...
- 设计模式多线程方面之Thread-Per-Message 模式
Thread-Per-Message模式是一个很简单但很常应用的模式,尤其是在GUI程式中,我们举个例子,当您设计一个文件编辑器时,您可能像这样注册一个开启档案的事件处理: menuOpenFile ...
- HDU2084:数塔(DP)
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- 基于visual Studio2013解决C语言竞赛题之0407最大值最小值
题目 解决代码及点评 这道题考察循环和比较 /*********************************************************************** ...
- HDU4648+Easy
N^2都能过!!!!!!! /* Easy */ #include<stdio.h> #include<string.h> #include<stdlib.h> # ...
- POJ 1155 - TELE 树型DP(泛化背包转移)..
dp[x][y]代表以x为根的子树..连接了y个终端用户(叶子)..所能获得的最大收益... dp[x][ ]可以看成当根为x时..有个背包空间为0~m...每个空间上记录了到到达这个空间的最大收益. ...
- aspx.cs上传文件
aspx.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- Oracle AWR 报告详解
转自:http://blog.csdn.net/laoshangxyc/article/details/8615187 持续更新中... Oracle awr报告详解 DB Name DB Id In ...
- c# 数据库编程(通过SqlCommand 执行DML语句)
原来一直是java,python等语言,最近用c#语言,并编写数据库访问代码.使用了之后,这里总结下,分享下c#如何操作数据库. 在java等其它语言中,有一套标准的api来完成数据库访问,并且一般都 ...
- 安装Devstack的DNS问题
所谓的OpenStack一键安装,省去了敲键盘的麻烦,但是卡在中间出了问题也是比较尴尬的 在公司内安装经常会出现卡在下载软件的地方,有时候还会出错 trick就是换一个US的dns,比如8.8.8.8