L前缀对字符来说到底意义着什么?

sosolife 2005-10-18 08:30:47
举个例:
wchar_t c1 = '金';
wchar_t c2 = L'金';
在运行时查c1,c2的值 居然不一样! c1的值为48624, c2的值为37329

希望有达人能解释一下这个L前缀到底带来的是什么? 有什么更深层的意义
...全文
516 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowbirdfly 2005-10-19
  • 打赏
  • 举报
回复
L前缀表示宽字符常量或字符串。
也就是用UNICODE 字符串~~
建议楼主看看windows程序设计上面也有详细说明~~~
megaboy 2005-10-19
  • 打赏
  • 举报
回复
狂晕,现在国际上用得最多的不是unicode32,也不是unicode16,当然也不是utf8,而是鸟语!哈哈哈。
K 2005-10-19
  • 打赏
  • 举报
回复
学习了!
wohow 2005-10-19
  • 打赏
  • 举报
回复
国际上用的最多的不是Unicode32,因为标准通常是美国制定,而他们使用英语,所以他们认为使用Unicode16和Unicode32都很浪费,因此国际上用的最多的是UTF8。另外Unicode16收集中文不会溢出。
晨星 2005-10-19
  • 打赏
  • 举报
回复
楼上说得对,严格说不等同于“Unicode”。
ddmor 2005-10-19
  • 打赏
  • 举报
回复
L前缀表示宽字符字符串(UNICODE)。
比如:
char c[]="小明明a";
unsigned short wc[]=L"小明明a";
cout<<strlen(c)<<endl;//输出7,单字符长度
cout<<wcslen(wc)<<endl;//输出4,宽字符长度
return 0;
bruceteen 2005-10-19
  • 打赏
  • 举报
回复
简单的说:
不加L的是 multibyte character,加L的是wide-character。
有些人说 Unicode 是不对的,Unicode 是 wide-character 的一种,但不是唯一的一种,到底使用哪一个具体的宽字符集完全取决于编译器,比如VC++使用Unicode,但GCC则不.
另外,既然是wide-character,那么sizeof(wchar_t)也就未必等于2,要注意这一点.大家可以查看ISO C++98标准说明书.
再另外,windows和Java使用的unicode是unicode16,而国际上使用最广泛的,宣称有各种优点的unicode其实是unicode32,制定它们的组织不一样. unicode16连中文收集都会溢出,谈何通用?
FlyingKaka 2005-10-19
  • 打赏
  • 举报
回复
支持晨星大哥~
fiftymetre 2005-10-19
  • 打赏
  • 举报
回复
算了没什么好说的了,再怎么说,偶也只是照搬WINDOWS程序第二章的内容的呵呵。你还是去看看吧
fiftymetre 2005-10-19
  • 打赏
  • 举报
回复
不知道偶说的是到不到位啊。唉哟,容偶在想想中。。。
fiftymetre 2005-10-19
  • 打赏
  • 举报
回复
首先请楼主明白,在16位OS下这种JJWW的东西是相当烦人的。拿L来说事吧。在汇编中,分为远指针和近指针之分,在16位的OS下也有这种长,短,远,近之分。但现在在32位的OS中没有了这种长,短,远,近之分了,详情你可以看看WINDOWS程序设计的第二章UNICODE,里面讲的非常详细的。

Unicode的最大好处是这里只有一个字元集,而他的缺点便是Unicode字串占用的记忆体是ASCII字串的两倍。

char c = 'A' ;  //变量c需要1个位元组来保存,并将用十六进位数0x41初始化,这是字母A的ASCII代码。

wchar_t c = 'A' ; //变量c是一个双位元组值0x0041,是Unicode表示的字母A

OK再看下面的

static wchar_t a[] = L"LOVE50MI" ;//该字串需要19个位元组的储存空间,sizeof (a) 将返回19。索引阵列a可得到单独的字元。a[0] 的值是宽字元「L」,或者0x004C。

wchar_t c = L'A' ;//你认为这个L有用吗?sosolife (大康) 嘿嘿这里的L是米有用啼C编译器会对该字元进行扩充,使它成为宽字元啼。

yajyjy 2005-10-19
  • 打赏
  • 举报
回复
_T("")和L""是一样的
晨星 2005-10-19
  • 打赏
  • 举报
回复
L打头的表示宽字符,这个不管是debug还是release都一样的,这是C++标准规定的。
不过对于非Ascii字符,C++标准似乎并未规定做编译器必须转换。因此不同的编译器可能结果不一样。就拿楼主的例子来说,如果使用gcc编译,估计结果就未必对。
因为如果要转换的话,编译器首先必须知道一些操作系统的区域设置信息。这一点在某些系统中可能是做不到的。
VC中是做了,因为VC目前只有Windows版,微软的人当然知道到哪里获得相关信息进行字符转换。
而某些Unix系统,通常依靠第三方组件来支持汉字库,那么编译器如何能知道“48624”是个GB汉字还是个其它国家文字呢?
wshcdr 2005-10-19
  • 打赏
  • 举报
回复
UP
wxrwan 2005-10-19
  • 打赏
  • 举报
回复
学习
NetsEagle 2005-10-19
  • 打赏
  • 举报
回复
和楼主一起学习
doway 2005-10-19
  • 打赏
  • 举报
回复
对哦。:)
sosolife 2005-10-19
  • 打赏
  • 举报
回复
引 bruceteen(周星星) "不加L的是 multibyte character,加L的是wide-character"

昨天看完了那个第二章 我现在也是这么理解的 通俗的说 '金' 和 L'金' 是用不同的编码方式表示的
不知道我理解得对不?

晚上来结贴..........
code_learner 2005-10-19
  • 打赏
  • 举报
回复
学习了,长知识~~~~~~~~~~~~
megaboy 2005-10-18
  • 打赏
  • 举报
回复
L前缀表示宽字符常量或字符串。
加载更多回复(4)

65,179

社区成员

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

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