为什么std::string也支持汉字,不是有wstring来支持宽字符串吗?

hydland 2002-06-05 02:58:33
为什么std::string也支持汉字,不是有wstring来支持宽字符串吗?
#include<iostream>
#include<string>
using std::cout;
using std::string;
using std::endl;

int main()
{
string str;
str="这是汉字的测试";
cout<<str<<endl;
cout<<sizeof str<<endl;
cout<<sizeof "这是汉字的测试"<<endl;
}
在bcb5中输出为:
这是汉字的测试
16
15


既然string能够支持宽字符串,为什么还要wstring呢?


还有一个问题,wchar_t算不算是c++内置的类型(如char,int)?
...全文
734 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpguo_java 2002-10-12
  • 打赏
  • 举报
回复
up 虫虫
你说string 和 wstring一样,为何我的小小测试却没通过???
见http://www.csdn.net/expert/topic/1089/1089797.xml?temp=.9657556
fangrk 2002-06-06
  • 打赏
  • 举报
回复
learning...
babysloth 2002-06-05
  • 打赏
  • 举报
回复
不好意思,wchar_t,写错了:-(
babysloth 2002-06-05
  • 打赏
  • 举报
回复
呵呵,I'm here.
什么地方没讲清楚呢?能告诉我吗?
我说说几点自己的看法吧
1、sizeof(str)没有任何意义,sizeof只是反映string这个类的大小,与它储存的字符串长度没有任何关系;应该用str.size()或str.length(),我那篇文章里提到了;
2、wstring和string并没有本质的不同,只是分别处理不同的字符类型而已;您觉得用哪个方便就用哪个,wstring对汉字和英文字母数字一视同仁,均作为一个字符,string则不是;
3、wchat_t是C++内建类型;但是在一些比较老的编译器上,可能会将其与int混淆;
zhdleo 2002-06-05
  • 打赏
  • 举报
回复
这期的程序员里,虫虫的迭代器,里面用了这个wstring,

我也没明白,不知道他能不看到!再来讲讲清楚!
hydland 2002-06-05
  • 打赏
  • 举报
回复
我想知道这中间的处理过程。
hydland 2002-06-05
  • 打赏
  • 举报
回复
steedhorse(晨星):
这个16,不管你是用什么来初始化str,它的大小都是16。
晨星 2002-06-05
  • 打赏
  • 举报
回复
sorry,每个字符统一占用2个字节,“这是汉字的测试”的长度是7
晨星 2002-06-05
  • 打赏
  • 举报
回复
string不支持宽字符,所以8个汉字才被看成了16个字符,而对於宽字符,不管中文西文,每个字符都是同意占用两个字节,那么“这是汉字的测试”的长度就是8。
这是概念问题,是否支持宽字符跟是否能够显示汉字是两个概念,而且早期的汉字编码如GB2312等等都不是宽字符的,早期UCDOS也不支持宽字符,不也照样显示汉字吗?
fangrk 2002-06-05
  • 打赏
  • 举报
回复
我也想知道
I.引言 在Basic(俺的入门语言),Pascal等语言中都提供了定长字符串类型,各有特色,Basic的 是长度固定,超出截断,不足补空格;;pascal的是最大长度限制在某个范围. 虽然定长字符串有这样那样的缺点(例如长度有限,弄不好会丢失数据;;) 定长字符串还是有一定的好处,主要是: 1.不分配在堆上,从而不会造成内存碎片 2.静态分配内存,分配速度快 因此我写了一个定长字符串类,用作轻量级的字符串.类似于pascal的定长字符串,也采用也采取饱和的方式来处理溢出. II.简介 主要类有: 1. template<;typename T,typename Traits=std::char_traits<;T>; >; class basic_small_string_base;; 这是定长字符串的基类,适用于各种字符类型,当然也支持";火星人的三字节字符";. 模板类的代码主要实现在该类中.该类是抽象类,不能够实例化. 2. template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >; class basic_small_string;; // : public basic_small_string_base<;T,Traits>; 特定长度的定长字符串模板类.如果C++标准支持模板typedef的话,下面的4的俩类就不用再写了,遗憾的是还不支持,所以他也是抽象类.//其实做成可实例化的类也没任何问题。 3. typedef basic_small_string_base<;char, std::char_traits<;char>; >; small_string_base;; typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >; small_wstring_base;; 针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符类型的基类的和默认traits 的typedef.写函数参数类型的时候可以少写几个字, ^=^ 4. template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >; class small_string;; // : public basic_small_string<;char, MaxSize,Traits>; 这是定长字符串的基类,适用于各种字符类型,当然也支持";火星人的三字节字符";. 模板类的代码主要实现在该类中.该类是抽象类,不能够实例化. 2. template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >; class basic_small_string;; // : public basic_small_string_base<;T,Traits>; 特定长度的定长字符串模板类.如果C++标准支持模板typedef的话,下面的4的俩类就不用 再写了,遗憾的是还不支持,所以他也是抽象类.//其实做成可实例化的类也没任何问题。 3. typedef basic_small_string_base<;char, std::char_traits<;char>; >; small_string_base;; typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >; small_wstring_base;; 针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符类型的基类的和默认traits 的typedef.写函数参数类型的时候可以少写几个字, ^=^ 4. template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >; class small_string;; // : public basic_small_string<;char, MaxSize,Traits>; template <;size_t MaxSize, typename Traits=std::char_traits<;wchar_t>; >; class small_wstring;; // : public basic_small_string<;char, MaxSize, Traits>; 真正能实例化的ANSI和WCHAR版本的定长字符串类. III.用法 该模板类用法和std::string一样,可以参考它的文档.另外为了兼容std::basic_string<;>;, 还提供了和std::string搭配的一些额外功能,比如函数的字符串参数都支持 std::basic_string.可以与std::basic_string<;>;进行比较,转换,连接等. 1. 包含头文件 #include";small_string.hpp"; 2.引入cfc命名空间 using namespace;; // 可以略去 3.实例化对象 cfc::small_string<;16>; s=";hello";;; // 一个缓冲区长度为16的定长字符串,内容为";hello"; // 最大长度为15,而不是16,注意! 作局部变量时效率上基本上等于 char s[]=";hello";;;低于char *s=";hello";;;原因很简单. 可以和std::string协同操作: std::string s3 = s;; s = s3;; 4.作为函数参数 作为非模板函数的参数传递时,参数的类型应该写成cfc::small_string_base&或者 cfc::small_wstring_base& ,根据需要,可以加上const: void foo(cfc::small_string_base& str) { str=";hello";;; } int main() { cfc::small_string<;32>; s;; foo(s);; } 其他插入,比较,删除等操作跟std::string一样 IV.实现 利用模板的最大缓冲区长度参数,实例化模板,把缓冲区作为数组直接建立在对象的内部. 为了减少代码膨胀,大部分功能都移入基类. V.结尾. 由于时间仓促,经历有限,经验不足,缺点错误肯定不少,欢迎大家批评指正. 谢谢!
wince上各种类型转换特别是字符串是很头疼的,这个类是项目用的, 每个都测试好用,使用静态方法,直接引用后,写【::cv::就可以用】 typedef int u32; //转换类,所有的转换函数在这里静态 2是to的意思 //cs:cstring //s:string //i:int class cv { public: static char * s2charx(string s); //static char * cs2charx_unicode(CString s); static char * cs2charx_unicode(CString s); static CString charx2cs(char *s); cv(); virtual ~cv(); static int cstring_to_int(CString t); static CString s2cs(string text); static CString i2cs(int i); static string cs2s(CString s); static void Utf8ToUnicode(wchar_t* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen); static void Gb2312ToUnicode(wchar_t* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen); static CString string_to_cstring(string text); static int string_to_int(string str); static string cstring_to_string(CString text); static void Gb2312ToUtf8(char* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen); static BOOL IsNumeric(string text); static void UnicodeToGb2312(char* pstrOut, u32 dwOutLen, const wchar_t* pstrIn, u32 dwInLen); static void Utf8ToGb2312(char* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen); static int cs2i(CString s); static string int_to_string(int n); static CString ChineseCapitalMoney(double Num); //static wstring s2ws( string s ); static std::wstring s2ws(const string& s); static std::string WChar2Ansi(LPCWSTR pwszSrc); static string ws2s(wstring& inputws); static const char * s2constcharx(string s); static std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen); static char * cs2charx_ansi(CString s); //static string ws2s(wstring ws); };

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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