还是关于LPTSTR和wchar_t字符串的问题 初学者提问

Mashpawo10 2009-04-29 01:39:22
问题1:
LPTSTR Str1 = _T("ABCDE");
int nSize1 = wcslen(Str1);//这里nSize1 = 5

wchar_t Str2[] = _T("ABCDE");
int nSize2 = sizeof(Str2);//这里nSize2 = 12

我的项目是Unicode 第2个nSize2是12我能理解 第一个为什么是5?

问题2:
Unicode将什么字符还作为单字节字符?什么字符作为宽字符??? 我感觉很乱很乱~!因为Unicode版本的很多函数 不能传入char*了 要传入wchar_t 而wchar_t就是宽字符集 然而Unicode有时候把字符看做宽字符 这样乱七八糟 不知道该怎么办了

问题3:
LPTSTR和wchar_t之间如何转换?
...全文
556 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liliangbao 2009-04-29
  • 打赏
  • 举报
回复
串的个数*元素类型的字节数就是整个串的字节数了~
wcslen是求宽字符,一个字符的字节数是2
所以:串的所占的字节数是6*2 = 12,5是不算串的结束符'\0',但实际上系统会自动加上这一位。
而字符数组则是必须明确给出这一位的,如:
wchar_t Str2[10];该数组最多存储9个字符,因为有一个用于存储'\0',只有这样才能将Str2当做字符串使用,
否则只能当做普通的数组使用(像int数组)~
rabbitlzx 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baiwei156 的回复:]
LPCTSTR,LPWSTR, PTSTR, LPTSTR,wchar_t区别

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。即win32中,long,near,far指针与普通指针没有区别,LP与P是等效的。
P表示这是一个指针。
T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。
C表示是一个常量,const。

LPTSTR:
如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。typedef LPTSTR LPWSTR;
否则LPTSTR被定义为LPSTR。 typedef LPTSTR LPSTR;
下面列出一些常用的typedefs:
类型 MBCS Unicode
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR TCHAR*(或char*) TCHAR* (或wchar_t*)
LPCTSTR const TCHAR* const TCHAR*

由于Win32 API文档的函数列表使用函数的常用名字(例如, SetWindowText"),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。所以结论,在VS2005系统中,为提高可移植性,定义字符串时用TCHAR,转化为UNICODE时用_T而不用L。
[/Quote]

顶这个,好详细!
liliangbao 2009-04-29
  • 打赏
  • 举报
回复
LPTSTR Str1 = _T("ABCDE");
int nSize1 = wcslen(Str1);//这里nSize1 = 5
就求串的个数,并不是串的字节数~
bingovox 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Mashpawo10 的回复:]
多谢楼上高手们的回答 有5个宽字符 正好是“ABCDE” 但是结尾没有"\0"的吗? “\0”也应该占有一个宽字符吧 应该是6啊 这样 还是LPTSTR本身最后就是没有"\0"的呢?
[/Quote]
函数碰到 "\0"不继续读下去了,不会把"\0"算在内。
wangyadong 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Mashpawo10 的回复:]
多谢楼上高手们的回答 有5个宽字符 正好是“ABCDE” 但是结尾没有"\0"的吗? “\0”也应该占有一个宽字符吧 应该是6啊 这样 还是LPTSTR本身最后就是没有"\0"的呢?
[/Quote]
有\0,计算长度的时候不包含在内的
Mashpawo10 2009-04-29
  • 打赏
  • 举报
回复
多谢楼上高手们的回答 有5个宽字符 正好是“ABCDE” 但是结尾没有"\0"的吗? “\0”也应该占有一个宽字符吧 应该是6啊 这样 还是LPTSTR本身最后就是没有"\0"的呢?
jame2001 2009-04-29
  • 打赏
  • 举报
回复
问题1:
共5個字元, 有問題嗎?
LPTSTR Str1 = _T("单字节字符");
int nSize1 = wcslen(Str1);
nSize1 也是 5

问题3:
LPTSTR 是 wchar_t 类型的指针
baiwei156 2009-04-29
  • 打赏
  • 举报
回复
LPCTSTR,LPWSTR, PTSTR, LPTSTR,wchar_t区别

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。即win32中,long,near,far指针与普通指针没有区别,LP与P是等效的。
P表示这是一个指针。
T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。
C表示是一个常量,const。

LPTSTR:
如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。typedef LPTSTR LPWSTR;
否则LPTSTR被定义为LPSTR。 typedef LPTSTR LPSTR;
下面列出一些常用的typedefs:
类型 MBCS Unicode
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR TCHAR*(或char*) TCHAR* (或wchar_t*)
LPCTSTR const TCHAR* const TCHAR*

由于Win32 API文档的函数列表使用函数的常用名字(例如, SetWindowText"),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。所以结论,在VS2005系统中,为提高可移植性,定义字符串时用TCHAR,转化为UNICODE时用_T而不用L。

Paradin 2009-04-29
  • 打赏
  • 举报
回复
又是这个?

wcslen计算宽字符的个数,就是5, 和strlen不同


视MBCS的种类而定


3.MultiByteToWideChar/WideCharToMultiByte


65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧