VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 261|回复: 6

[已解决]关于字符的问题

[复制链接]
45_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-22 09:50:54 | 显示全部楼层 |阅读模式
本人C#转C++的,最近遇到字符转换问题,搞得头痛,因此过来求助一下!请各位伸出援手,不胜感激!
问题一:多字节,宽字节和unicod之间的关系
问题二:Cstring ,char和string在上面的存储有什么关联?如果Cstring是宽字节的,他转换成char类型怎么转?
问题三:问题二中的三个类型是不是都可以已问题一的三个方式存储?
最佳答案
51_avatar_small
2019-10-22 10:45:51
字符串类型和转换这块是很多新手刚开始比较懵逼的问题,我初学的时候也是琢磨了好久。
理解大多数新手的难处,所以我后来出了一套专门针对新手学习字符串的教程:《实用VC编程之玩转字符串》
有时间可以看看:https://www.cctry.com/forum-153-1.html

问题一:多字节就是窄字节的,正常是1个字节表示数字或者字母,2个字节表示一个汉字,缺点是多字节的中文界面的程序在日文或者韩文的系统上会显示乱码。Unicode使用2个字节表示一个字符,缺点是占用空间大,优点就是解决了多字节的缺点;
问题二:CString是ATL中微软封装的一套字符串处理类,内部是TCHAR类型的指针,会根据当前工程的编码自动识别是多字节还是Unicode。char 是C/C++中默认的字符类型,string 是 C++ 标准模板库STL中的字符串模板类,默认也是多字节的。
如果CString是宽字节的,想转成char这种多字节的,方法有多种,具体见:
https://www.cctry.com/thread-297540-1-1.html

问题三:三个类型不同,但是都有多字节和宽字节版本:CString自然是自适应了,char 是窄字节的,wchar_t 就是宽字节的,string 是窄字节的,wstring 是宽字节的。




上一篇:syc的经典面试题目中好像有一个错误
下一篇:数组的内存不应该是被回收了吗?为什么返回指向该数组的指针
50_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-22 11:04:28 | 显示全部楼层
这个问题很简单,百度就有答案,这个问题也很重要,不同的编译器、或者相同IDE的不同版本也常会遇到这个问题。

这里面应该有几个问题:
1、单字节、双字节、多字节及编码规范;
ASCII码表就是单字节,但是不够用;
于是对于某些特定的语言就出现了码表,常用汉字3500个,不常用的上万个,GB2312?,中文、日文、韩文,西方拉丁语系的符号等,装不下了,扩展了多字节,Unicode?
unicode?有些字符不需要使用两字节,有的基础符号得4个字节? utf-8? utf-16?,每种字符集都有自己的码表,压缩编码的还有编码规则,某些压缩编码又是在某一个特定字符集上进行的加工,他们的码表有映射关系,可以转换,码表跟操作系统有关系,可能小机的码表和pc机的码表完全不同。具体可以去百度。

2、C/C++及不同版本新特性的字符类型的互相转化。
char 是一个带符号的存储空间,占8位,即一个8位的内存,类型为char,就告诉编译器按照char类型进行解释。
string是C++的标准数据类型,C++版本不断推进,string也在不断演化,但基本向下兼容,
CString是微软基础类库的数据类型,是与C++规范类似的微软实现。

取出string的字符值? c_str();
取出CString的字符值? GetBuffer()://好像是这样
编码数据取出来 UTF8/UTF16/Unicode互转?网上都有代码,查查看。
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-10-22 10:45:51 | 显示全部楼层    本楼为最佳答案   
bestAnswer
字符串类型和转换这块是很多新手刚开始比较懵逼的问题,我初学的时候也是琢磨了好久。
理解大多数新手的难处,所以我后来出了一套专门针对新手学习字符串的教程:《实用VC编程之玩转字符串》
有时间可以看看:https://www.cctry.com/forum-153-1.html

问题一:多字节就是窄字节的,正常是1个字节表示数字或者字母,2个字节表示一个汉字,缺点是多字节的中文界面的程序在日文或者韩文的系统上会显示乱码。Unicode使用2个字节表示一个字符,缺点是占用空间大,优点就是解决了多字节的缺点;
问题二:CString是ATL中微软封装的一套字符串处理类,内部是TCHAR类型的指针,会根据当前工程的编码自动识别是多字节还是Unicode。char 是C/C++中默认的字符类型,string 是 C++ 标准模板库STL中的字符串模板类,默认也是多字节的。
如果CString是宽字节的,想转成char这种多字节的,方法有多种,具体见:
https://www.cctry.com/thread-297540-1-1.html

问题三:三个类型不同,但是都有多字节和宽字节版本:CString自然是自适应了,char 是窄字节的,wchar_t 就是宽字节的,string 是窄字节的,wstring 是宽字节的。
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-23 09:01:14 | 显示全部楼层
丧德·彪夫斯基 发表于 2019-10-22 11:04
这个问题很简单,百度就有答案,这个问题也很重要,不同的编译器、或者相同IDE的不同版本也常会遇到这个问 ...

在VS属性页设置Unicode和多字节就是设置编码格式
char类型和CString类型这些就是按照对应的编码格式进行转换,其中Char类型是窄字节的编码方式,CString类型比较灵活可以自适应不同的编码格式;是这个意思吧?那问题来了,窄字节的编码方式转换成宽字节的编码方式,数据不会错吗?就是窄字节对应的表和宽字节对应的表不一样呢。
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-23 09:02:19 | 显示全部楼层
Syc 发表于 2019-10-22 10:45
字符串类型和转换这块是很多新手刚开始比较懵逼的问题,我初学的时候也是琢磨了好久。
理解大多数新手的难 ...

好的,谢谢!
有空看看!
看了大哥们的解答,心里有点b数了!关于字符的问题
50_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-23 16:04:14 | 显示全部楼层
MyuyuzZ 发表于 2019-10-23 09:01
在VS属性页设置Unicode和多字节就是设置编码格式
char类型和CString类型这些就是按照对应的编码格式进行 ...

char 也能 放 unicode呀,有什么问题?他就是一段内存。放什么都可以呀。宽窄是微软的内部版本实现,跟字符集编码有关系,跟盛装的内存容器没有任何关系。

如果没有C++,就是使用标准C,难不成还不能解析unicode了?,宽字节和窄字节会不会存在转换?当然会。有的程序界面展示按照宽字节展示,有的是窄字节,怎么转换?网上一大把。

单纯看这个一点意义没有,等你遇到了,比如说调用一个DLL,人家是按照宽字节的,你的程序是窄字节的,你送进去或者读出来显示就是乱码,网络程序,网络流里面的人家是宽字节的,你的是窄字节的,你解出来又是乱码。
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-11-29 20:09:08 | 显示全部楼层
两位大佬的回复都很棒,设置为最佳答案只是应付规矩
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-27 17:50

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表