C/C++ :关于字符串与宽字符串,LPCTSTR , LPCWSTR的解释及其相互转换

11 篇文章 2 订阅
1 篇文章 0 订阅

定义

(参考 : MSDN)
LPCWSTR : An LPCWSTR is a 32-bit pointer to a constant string of 16-bit Unicode Charactor, which may be null-terminated.
This type is declared as follows:

typedef const wchar_t * LPCWSTR;

是一个指向16位unicode编码的常量字符串的32位指针,这个字符串可以是以空字符结尾的(即'\0'

LPCTSTR : A 32-bit pointer to a constant character string that is portable for Unicode and DBCS. 是一个指向常量字符串的32位指针,便于在Unicode和DBCS1中使用

L : Long表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P : Pointer 表示这是一个指针
C : Const表示是一个常量
T : 表示_T宏
W : Wide表示wchar_t类型
STR : 表示这个变量是一个字符串

CStringLPCTSTR 可以通用。 原因在于CString定义的自动类型转换
常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时是否定是_UNICODE来决定是char *还是 wchar_t *。 同样,TCHAR 也是相同目的字符宏。

再补一个链接说明:
char、wchar_t、char16_t、char32_t


转换

1.char * 转换成 wchar_t *

char s[1024] = "hello,world!";
int num = MultiByteToWideChar(0,0,s,-1,NULL,0);
wchar_t *w_s = new wchar_t[num];
MultiByteToWideChar(0,0,s,-1,w_s,num);

分析:

  • num 获得wchar_t *变量所需的空间

  • MultiByteToWideChar() 表示将char *中的字符copy到wchar_t *指向的内存中。其中 -1 表示拷贝至s中的'\0'处,num表示拷贝的字节个数。

2.wchar_t * 转换成 char *

wchar_t w_s[1024] = L"hello,world!";
int num = WideCharToMultiByte(CP_OEMCP,NULL,w_s,-1,NULL,0,NULL,FALSE);
char *s = new char[num];
WideCharToMultiByte (CP_OEMCP,NULL,w_s,-1,s,num,NULL,FALSE);

  1. DBCS是ASCII,较高的128个代码中的某些总是跟随著第二个位元组(位,Bit)。这两个位元组(位,Bit)一起(称作首位元组和跟随位元组)定义一个字元,通常是一个复杂的象形文字。虽然中文、日文和韩文共用一些相同的象形文字,但显然这三种语言是不同的,而且经常是同一个象形文字在三种不同的语言中代表三件不同的事。Windows支持四个不同的双位元组字元集:内码表932(日文)、936(简体中文)、949(韩语)和950(繁体汉字)。只有为这些国家(地区)生产的Windows版本才支持DBCS。明白Unicode和DBCS之间的区别很重要。Unicode使用(特别在C程式设计语言环境里)宽字元集。Unicode中的每个字元都是16位元宽而不是8位元宽。在Unicode中,没有单单使用8位元数值的意义存在。相比之下,在双位元组字元集中我们仍然处理8位元数值。有些位元组自身定义字元,而某些位元组则显示需要和另一个位元组共同定义一个字元。
    (来源:百度百科) ↩︎

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值