[TL][初级]用CString还是std::wstring/std::string

347 views
Skip to first unread message

haozes

unread,
Mar 9, 2010, 9:10:18 PM3/9/10
to pongba
我是个C/C++初学者,正打算用WTL写个的工具练习.在字符串使用方面比较迷惑,搜索了半天和别人讨论了感觉还是没有找到答案.在此冒昧请教下大家:
有人告诉我:
1.STL与Windows系列的库混用有风险的,需要考虑到的细节太多。
2.要么用stl,要么用Windows的库,不要混用。 
却没有在哪些方面有风险,和为什么
--------------
先说我不想用CString的理由: 
1.我在WTL的类库里面有用字符串相关的函数的情况,都是LPCTSTR 之类的.没有直接用CString.这种情况下,CString不是必须. 

2.经过比较,我决定放弃使用TCHAR类型的函数,工程使用Unicode.我感觉这样更清晰,T类型的函数让我更迷惑,要不使用char* string要不就用wchar_t*,wstring.更简单的.

3.我在使用一些网上的开源库的时候,别人的代码都是std:string.如果我使用CString.会带来很多转换.很ugly.这牵涉到我声明的函数接口,还有对象的定义到底是什么,
总不至于用char*/wchar_t*参数吧.

4.据说Chrome用了WTL.我搜索了下Chrome里面,瞅了一眼,压根没到CString.和界面相关的东西,Chrome使用的字符串都是wstring/wchar_t宽的,
--------------
告诉我:
1.在WTL工程里使用CString优先么?(我质疑这一点.)
2.和界面相关的是否需要使用宽字节的?
(虽然我不是做一个国际化的软件)在.NET里面所有的字符串默认是Unicode的,.NET从根本上避免了ANSI和Unicode的字符串转化问题.

想听听大家的高论

Jeffrey Zhao

unread,
Mar 9, 2010, 9:13:01 PM3/9/10
to pon...@googlegroups.com
我基本不懂这些,不过这年代用Unicode是标配了吧……

wang carl

unread,
Mar 9, 2010, 9:17:57 PM3/9/10
to pon...@googlegroups.com
关注一下。

Yuan Liu

unread,
Mar 9, 2010, 9:33:53 PM3/9/10
to pon...@googlegroups.com
我个人的意见:

  不考虑大规模数据存储和数据网络传输的话,使用某种Unicode,全部用wchar挺好,操作简单

  如果是大量数据,需要考虑存储空间以及传输延迟的话,在存储或者传输之前,把Unicode变成变长编码就行(即内码和外码)

  其实关键要分清概念:字符集和编码

2010/3/10 Jeffrey Zhao <je...@live.com>



--
Yuan Liu

Colin Song

unread,
Mar 9, 2010, 11:42:25 PM3/9/10
to TopLanguage
只是练习的话, 可以都试试.

刘德欣

unread,
Mar 10, 2010, 12:16:06 AM3/10/10
to TopLanguage
如果你使用MFC库的话,最方便的就是CString类了。不管是CString类还是LPCTSTR,都是根据编译环境自动使用char*或
wchar_t*的。
但是std::string与std::wstring不会根据编译环境而变化。std::string始终使用char*进行包装;
std::wstring始终使用wchar_t*进行包装。
这是CString与std::string及std::wstring最大的区别,两者没有好坏区别,关键在于你的编译环境上:UNICODE内核还
是非UNICODE内核,这是个问题。

haozes

unread,
Mar 10, 2010, 2:15:06 AM3/10/10
to pongba
To 2楼:
我相信有相当的WIN32工程UNICODE化不完全,我接触的不多.而.NET开发中我基本没遇到此类问题(也可能我写的太少...).

To 4 楼:网络传输很多用Utf-8 编码传输,我理解.

To:6
虽然我用的不是MFC.但ATL/WTL里面也有CString.用CString.也未定多方便,别人写的库接口,肯定很少用会CString,当然会用std里的或者c style 字符串.我说就是这个疑问.让我不想用CString. 我感觉用哪种字符串牵涉到函数和类的设计.弄的不好会很别扭.


Win 7应当是UNICODE内核呵.

2010/3/10 刘德欣 <darxin...@gmail.com>

sagasw

unread,
Mar 10, 2010, 2:28:05 AM3/10/10
to pon...@googlegroups.com
如果自己写练习程序,或者不准备作为库使用,CString 非常好用,比string容易的多。

编程图的什么?方便、顺手而已。

最新版本的CString内部也是通过std string或者wstring实现,用得着想这么多么?YAGNI

至于哪个好哪个不好,慢慢写自然就有感觉了。

------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2010/3/10 haozes <hao...@gmail.com>

Lei Yang

unread,
Mar 10, 2010, 4:13:56 AM3/10/10
to pon...@googlegroups.com
通常来说我会把程序分成界面部分和算法部分,当然可能还有更多层,一般情况下
界面部分的数据处理使用CString及MFC的容器类, 算法部分使用std::w/string。

再有CString是受到_UNICODE宏影响的,可以是unicode也可以是ANSI,
如果使用std::string,你最好要定义一个tstring。

#ifdef _UNIDOE
#define tstring std::wstring
#else
#define tstring std::string
#endif

标准库和windows API混用确实不方便。


2010/3/10 sagasw <sag...@gmail.com>

刘德欣

unread,
Mar 10, 2010, 4:34:59 AM3/10/10
to TopLanguage
> 告诉我:
> 1.在WTL工程里使用CString优先么?(我质疑这一点.)
WTL中使用了大量的LPCTSTR与TCHAR,
而这种类型是编译时可以自动识别内核的。
所以CString肯定是优先对应的。
如果你明确使用UNICODE内核,可以避开CString类而使用std::wstring。
需要注意的是UNICODE内核下,std::string是不能用的。

> 2.和界面相关的是否需要使用宽字节的?
如果你的应用程序非常明确只在一种语言的操作系统上使用,
(例如只在中文操作系统下使用,或只在日文操作系统下使用。)
那么编译成非UNICODE内核是可行的方案。
如果你想要让应用程序在中文OS或日文OS下都能正常显示及操作,
请编译成UNICODE内核。

PS:
使用C++制作共通库时,
如果声明的接口使用std::string,编译时必须使用非UNICODE内核;
如果声明的接口使用std::wstring,编译时必须使用UNICODE内核;
如果声明的接口使用BSTR时,编译时两种内核都可以。
使用那一种由你选择。
上述说明如果有异议,请指正。

Bear King

unread,
Mar 10, 2010, 8:21:51 AM3/10/10
to pon...@googlegroups.com
练习的话,何不自己实现String类,想怎么样都行。
可以类似于CString的实现,可以学到不少东西,虽然CString的实现一直为人所诟病

2010/3/10 haozes <hao...@gmail.com>:

Yongwei Wu

unread,
Mar 10, 2010, 9:05:38 AM3/10/10
to pon...@googlegroups.com
还有,需不需要跨平台?

我们希望跨平台,所以标准化在UTF-8/string上。最近刚写了一大堆在UTF-8、
ANSI string和wchar_t string之间转换的类和函数。

2010/3/10 Yuan Liu <xiaol...@gmail.com>:


> 我个人的意见:
> 不考虑大规模数据存储和数据网络传输的话,使用某种Unicode,全部用wchar挺好,操作简单
> 如果是大量数据,需要考虑存储空间以及传输延迟的话,在存储或者传输之前,把Unicode变成变长编码就行(即内码和外码)
> 其实关键要分清概念:字符集和编码
>
> 2010/3/10 Jeffrey Zhao <je...@live.com>
>>

>> 我基本不懂这些,不过这年代用Unicode是标配了吧......


--
Wu Yongwei
URL: http://wyw.dcweb.cn/

up duan

unread,
Mar 10, 2010, 5:18:13 PM3/10/10
to pon...@googlegroups.com
关于C++各种字符串类的转换和使用问题,可以看看shim概念,同时看看STLSoft的实作。个人感觉这是一个非常漂亮的方案。

2010/3/10 Yongwei Wu <wuyo...@gmail.com>

sagasw

unread,
Mar 10, 2010, 8:40:30 PM3/10/10
to pon...@googlegroups.com
who? where? why?

还是说CString是MFC的就是为人诟病,是微软的就是出身不好?

我就觉得CString很好用.有些时候比std string省事多了.


------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2010/3/10 Bear King <king.b...@gmail.com>

Googol Lee

unread,
Mar 10, 2010, 8:45:50 PM3/10/10
to TopLanguage
楼主其实还没有了解到CString/wchar/char和ansi/utf8/utf16/gbk这两类概念的区别。前者是字符串这种数据结构的不
同实现,后者是字符编码的不同标准。

我个人建议在程序内部使用定长字符编码,也就是utf16或者gbk甚至像风云那样自己创造,好处是在需要做池存储或者字符串分段引用时,容易计算偏移
长度。而输入输出应该统一使用utf8,好处是一批标准函数(不是所有)不做任何修改就可以操作utf8,而且这种编码对于英文是最节省空间的(可惜对
中文不是)。

当你明确了你是要用什么文字编码之后,再去谈用什么字符串实现。基本上CString(要看tchar的定义)和wchar都是用来存定长字符串编码
(utf16或者gbk),而char一般拿来存ansi或者utf8,存utf8时需要考虑配套api是否能支持utf8(主要是不能直接使用定长偏
移操作。)

On Mar 10, 10:05 pm, Yongwei Wu <wuyong...@gmail.com> wrote:
> 还有,需不需要跨平台?
>
> 我们希望跨平台,所以标准化在UTF-8/string上。最近刚写了一大堆在UTF-8、
> ANSI string和wchar_t string之间转换的类和函数。
>

> 2010/3/10 Yuan Liu <xiaolang...@gmail.com>:


>
>
>
>
>
> > 我个人的意见:
> > 不考虑大规模数据存储和数据网络传输的话,使用某种Unicode,全部用wchar挺好,操作简单
> > 如果是大量数据,需要考虑存储空间以及传输延迟的话,在存储或者传输之前,把Unicode变成变长编码就行(即内码和外码)
> > 其实关键要分清概念:字符集和编码
>
> > 2010/3/10 Jeffrey Zhao <je...@live.com>
>
> >> 我基本不懂这些,不过这年代用Unicode是标配了吧......
> >> Jeffrey Zhao
> >> Blog:http://www.cnblogs.com/JeffreyZhao/
> >> Twitter:https://twitter.com/jeffz_cn
> >> From: haozes
> >> Sent: Wednesday, March 10, 2010 10:10 AM
> >> To: pongba
> >> Subject: [TL][初级]用CString还是std::wstring/std::string
> >> 我是个C/C++初学者,正打算用WTL写个的工具练习.在字符串使用方面比较迷惑,搜索了半天和别人讨论了感觉还是没有找到答案.在此冒昧请教下大家:
> >> 有人告诉我:
> >> 1.STL与Windows系列的库混用有风险的,需要考虑到的细节太多。
> >> 2.要么用stl,要么用Windows的库,不要混用。
> >> 却没有在哪些方面有风险,和为什么
> >> --------------
> >> 先说我不想用CString的理由:
> >> 1.我在WTL的类库里面有用字符串相关的函数的情况,都是LPCTSTR 之类的.没有直接用CString.这种情况下,CString不是必须.
> >> 2.经过比较,我决定放弃使用TCHAR类型的函数,工程使用Unicode.我感觉这样更清晰,T类型的函数让我更迷惑,要不使用char*
> >> string要不就用wchar_t*,wstring.更简单的.
>

> >> 3.我在使用一些网上的开源库的时候,别人的代码都是std:string.如果我使用CString.会带来很多转换.很ugly.这牵涉到我声明的函数接口 ,还有对象的定义到底是什么,
> >> 总不至于用char*/wchar_t*参数吧.
>
> >> 4.据说Chrome用了WTL.我搜索了下Chrome里面,瞅了一眼,压根没到CString.和界面相关的东西,Chrome使用的字符串都是wstri ng/wchar_t宽的,

sagasw

unread,
Mar 10, 2010, 8:53:10 PM3/10/10
to pon...@googlegroups.com
我觉得楼主最需要的是"淡定".
先动手,会用什么,你就用什么,碰到问题了,fix bug.
积累一些经验以后考虑这些高层次的东西.
刚会走两步就想进入奥运会,想得太远了.

------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2010/3/11 Googol Lee <goog...@gmail.com>

haozes

unread,
Mar 10, 2010, 8:56:25 PM3/10/10
to pongba
的确没这个意思,和您说的一样,编程图个啥,顺手.好用而已.哪个好用就用哪个.更无对MS的东西看不起的意思,相反喜欢用MS的东西.
----
回正题,CString是很好用,可是经常引用其它库的时候,人家用的是std的string.非得转一下,比较不爽.此时它丫不顺手.难道只有新手有这感觉么?就是难以统一.能统一,我愿意用任何一种.

2010/3/11 sagasw <sag...@gmail.com>

sagasw

unread,
Mar 10, 2010, 9:00:52 PM3/10/10
to pon...@googlegroups.com
std string到char*不需要转么?一样要的.
如果觉得这样不好看,你自己包装一下CString,自动作这个转换就可以了,应该不难实现.

编程切记,切忌有固定模式思维,试了以后才有自己的感受.
别人说这个好用那个好用,未必真的好用.就算是牛顿爱因斯坦不也一样会犯错误,是不是?

慢慢来,自然你也会感觉到编程中的乐趣.


------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2010/3/11 haozes <hao...@gmail.com>

haozes

unread,
Mar 10, 2010, 9:03:35 PM3/10/10
to pongba
sagasw.教训的有道理.
的确有点这种感觉,在有过其它编程经验后,现在每次新学一种编程语言,除了语言规则外,都是在看一些代码规范一类的东西才想动手,不然总感觉怪怪的,不知道遵循哪种规范去写.甚至先去看下一些所谓的最佳实践的准则去做.而C++又是个大杂烩,甚至连代码规范都没有统一,只好看了看google 的 style guid,发现在win下面,也不好完全遵循.

2010/3/11 sagasw <sag...@gmail.com>

sagasw

unread,
Mar 10, 2010, 9:14:15 PM3/10/10
to pon...@googlegroups.com
千万别说啥教训,我也是庸人一个,只是把自己的想法share一下罢了。
一个老程序员,除了这些口水也没别的东西了。

语气不是那么委婉,望见谅。


------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2010/3/11 haozes <hao...@gmail.com>

Yongwei Wu

unread,
Mar 10, 2010, 10:12:29 PM3/10/10
to pon...@googlegroups.com
2010/3/11 Googol Lee <goog...@gmail.com>:
> 楼主其实还没有了解到CString/wchar/char和ansi/utf8/utf16/gbk这两类概
> 念的区别。前者是字符串这种数据结构的不同实现,后者是字符编码的不同标
> 准。
>
> 我个人建议在程序内部使用定长字符编码,也就是utf16或者gbk甚至像风云那

问题是,UTF-16并非定长。你只处理常用中文的话没问题,需要处理古文字或者
需要国际化就不行了。

GBK也不是定长,长度是一字节或两字节。GB18030就更搞了,一字节或两字节或
四字节。

真正定长的只有UCS-2(只能处理Unicode的一个子集)和UTF-32(四字节)。
Linux环境下wchar_t一般定义为四字节,UTF-32。

> 样自己创造,好处是在需要做池存储或者字符串分段引用时,容易计算偏移长
> 度。而输入输出应该统一使用utf8,好处是一批标准函数(不是所有)不做任
> 何修改就可以操作utf8,而且这种编码对于英文是最节省空间的(可惜对中文
> 不是)。
>
> 当你明确了你是要用什么文字编码之后,再去谈用什么字符串实现。基本上
> CString(要看tchar的定义)和wchar都是用来存定长字符串编码(utf16或者
> gbk),而char一般拿来存ansi或者utf8,存utf8时需要考虑配套api是否能支
> 持utf8(主要是不能直接使用定长偏移操作。)

你说的这些都不是定长编码。除非你在西文平台上,ANSI=ISO-8859-1。

Googol Lee

unread,
Mar 10, 2010, 10:22:08 PM3/10/10
to TopLanguage
恩,是,gbk对英文的确实是不定长,这个我忽略了。

utf16严格来讲确实是不定长的,但是一般用的时候都当定长用。

utf32一般很少见到工程中用的。

说的不够严谨,多谢指正。

On Mar 11, 11:12 am, Yongwei Wu <wuyong...@gmail.com> wrote:
> 2010/3/11 Googol Lee <googol...@gmail.com>:

Yongwei Wu

unread,
Mar 10, 2010, 11:47:05 PM3/10/10
to pon...@googlegroups.com
说UTF-32很少用不对吧。Linux项目的国际化,一般要么内部使用UTF-8,要么内
部使用UTF-32。

当然,一开始就跨平台的项目可能不这么做。ICU也缺省内部使用UTF-16。
Windows开发如果希望好的国际化的话,可以考虑使用ICU。除非你使用UTF-32,
一个字符可能超过一个字符单位(char、TCHAR、UChar,甚至Windows上的
wchar_t)。

2010/3/11 Googol Lee <goog...@gmail.com>:

archer

unread,
Mar 25, 2010, 3:56:27 AM3/25/10
to pon...@googlegroups.com
个人倾向Lei Yang的意见,纯Business Logic的地方考虑std string/wstring,和其它类库交互的地方转换成适合的字符串类型。当然,我说的可能太理想化了一点。关键我觉得是掌握Char Set、Encoding、不同字符串类型的实质和转换方法。


2010/3/11 Yongwei Wu <wuyo...@gmail.com>

Yi Lee

unread,
Mar 25, 2010, 8:24:19 AM3/25/10
to pon...@googlegroups.com
联想到曾经把一些Windows平台的代码移植到Linux平台的痛苦经历,个人觉得还是使用UTF8比较好一点

2010/3/11 Yongwei Wu <wuyo...@gmail.com>

jrckkyy

unread,
Apr 7, 2010, 11:30:37 PM4/7/10
to pon...@googlegroups.com
全部用char * 编码采用Latin1确保不会出现任意编码信息位丢失的情况,需要什么再转换成什么,mysql的默认编码latin1还是有他的道理的。
--

http://hi.baidu.com/jrckkyy

选择百度博客的原因只为更快的CRUD思维上的碎片

Serenade

unread,
Apr 13, 2010, 9:12:25 AM4/13/10
to pon...@googlegroups.com
现在,在WTL里使用CString是不需要背上MFC包袱的,所以放心使用CString吧,不会增大你的应用程序的
Reply all
Reply to author
Forward
0 new messages