﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-量变到质变我需要时间          Welcom To Cplusplus World-文章分类-C++知识</title><link>http://www.cppblog.com/dotaqop/category/16927.html</link><description>Code</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jun 2011 19:12:00 GMT</lastBuildDate><pubDate>Tue, 07 Jun 2011 19:12:00 GMT</pubDate><ttl>60</ttl><item><title>堆和栈</title><link>http://www.cppblog.com/dotaqop/articles/148214.html</link><dc:creator>Hsssssss</dc:creator><author>Hsssssss</author><pubDate>Tue, 07 Jun 2011 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/dotaqop/articles/148214.html</guid><wfw:comment>http://www.cppblog.com/dotaqop/comments/148214.html</wfw:comment><comments>http://www.cppblog.com/dotaqop/articles/148214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dotaqop/comments/commentRss/148214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dotaqop/services/trackbacks/148214.html</trackback:ping><description><![CDATA[<p><strong></strong></p>
<p><span style="color: red"><strong>解释堆和栈的区别</strong></span></p>
<p>一、预备知识&#8212;程序的内存分配</p>
<p>一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区（stack）&#8212;&nbsp;&nbsp; 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、堆区（heap） &#8212;&nbsp;&nbsp; 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br />3、全局区（静态区）（static）&#8212;，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 <br />4、文字常量区&nbsp; &#8212;常量字符串就是放在这里的。 程序结束后由系统释放<br />5、程序代码区&#8212;存放函数体的二进制代码。<br /></p>
<p>二、例子程序 <br />这是一个前辈写的，非常详细 <br />//main.cpp <br />int a = 0; 全局初始化区 <br />char *p1; 全局未初始化区 <br />main() <br />{ <br />int b; 栈 <br />char s[] = "abc"; 栈 <br />char *p2; 栈 <br />char *p3 = "123456"; 123456\0在常量区，p3在栈上。 <br />static int c =0； 全局（静态）初始化区 <br />p1 = (char *)malloc(10); <br />p2 = (char *)malloc(20); <br />分配得来得10和20字节的区域就在堆区。 <br />strcpy(p1, "123456"); 123456\0放在常量区，编译器可能会将它与p3所指向的"123456"优化成一个地方。 <br />} <br /></p>
<p>二、堆和栈的理论知识 </p>
<p>2.1申请方式 <br />stack: <br />由系统自动分配。 例如，声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 </p>
<p>heap: <br />需要程序员自己申请，并指明大小，在c中malloc函数 <br />如p1 = (char *)malloc(10); <br />在C++中用new运算符 <br />如p2 = (char *)malloc(10); <br />但是注意p1、p2本身是在栈中的。 </p>
<p><br />2.2 <br />申请后系统的响应 <br />栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。 <br />堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时， 会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，</p>
<p>这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。 </p>
<p>2.3申请大小的限制 <br />栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址</p>
<p>和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。 <br />堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。 </p>
<p><br />2.4申请效率的比较： <br />栈由系统自动分配，速度较快。但程序员是无法控制的。 <br />堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便. <br />另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。 </p>
<p>2.5堆和栈中的存储内容 <br />栈： 在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。 <br />当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。 <br />堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 </p>
<p>2.6存取效率的比较 </p>
<p>char s1[] = "aaaaaaaaaaaaaaa"; <br />char *s2 = "bbbbbbbbbbbbbbbbb"; <br />aaaaaaaaaaa是在运行时刻赋值的； <br />而bbbbbbbbbbb是在编译时就确定的； <br />但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。 <br />比如： <br />#include <br />void main() <br />{ <br />char a = 1; <br />char c[] = "1234567890"; <br />char *p ="1234567890"; <br />a = c[1]; <br />a = p[1]; <br />return; <br />} <br />对应的汇编代码 <br />10: a = c[1]; <br />00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] <br />0040106A 88 4D FC mov byte ptr [ebp-4],cl <br />11: a = p[1]; <br />0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] <br />00401070 8A 42 01 mov al,byte ptr [edx+1] <br />00401073 88 45 FC mov byte ptr [ebp-4],al <br />第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到edx中，在根据edx读取字符，显然慢了。 </p>
<p>堆和栈的区别及内存泄露- -<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 堆和栈是两个不同的概念。在学微机原理时没有感觉到，因为书上只提到了堆栈；数据结构上也提到过栈。但是，始终不明白什么是堆，什么是栈。后来无意翻看了C++，才知道（只是知道，不是明白，更称不上懂）它们的区别。</p>
<p>&nbsp;&nbsp;&nbsp; 简单的来讲堆（heap）上分配的内存，系统不释放，而且是动态分配的。栈（stack）上分配的内存系统会自动释放，它是静态分配的。</p>
<p>&nbsp;&nbsp;&nbsp; 由malloc或new分配的内存都是从heap上分配的内存，从heap上分配的内存必须有程序员自己释放，用free来释放，否则这块内存会一直被占用而得不到释放，就出现了&#8220;内存泄露（Memory Leak）&#8221;。这样会造成系统的可分配内存的越来越少，导致系统崩溃。</p>
<p>&nbsp;&nbsp;&nbsp; C/C++是&#8220;跨国语言&#8221;，在任何平台上都可以使用。所以，Memory Leak在每个系统上都会出现。避免方法就是在写完malloc后，紧跟着就在下一行写free。然后在两行代码中间加其他的代码。哈哈，梁肇新的成对编码，这样会很好的解决。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/hanlin1985/archive/2008/10/10/3048673.aspx</p><img src ="http://www.cppblog.com/dotaqop/aggbug/148214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dotaqop/" target="_blank">Hsssssss</a> 2011-06-07 16:38 <a href="http://www.cppblog.com/dotaqop/articles/148214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wchar_t</title><link>http://www.cppblog.com/dotaqop/articles/148054.html</link><dc:creator>Hsssssss</dc:creator><author>Hsssssss</author><pubDate>Sat, 04 Jun 2011 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/dotaqop/articles/148054.html</guid><wfw:comment>http://www.cppblog.com/dotaqop/comments/148054.html</wfw:comment><comments>http://www.cppblog.com/dotaqop/articles/148054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dotaqop/comments/commentRss/148054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dotaqop/services/trackbacks/148054.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<p>关于wchar_t</p>
<p>在C++标准中，wchar_t是宽字符类型，每个wchar_t类型占2个字节，16位宽。汉字的表示就要用到wchar_t 。char，我们都知道，占一个字节，8位宽。</p>
<p>标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。</p>
<p>locale loc( "chs" );//定义&#8220;区域设置&#8221;为中文方式<br />wcout.imbue( loc );//载入中文字符输入方式<br />wchar_t str[]=L"中国";//定义宽字符数组，注意L是大写<br />wcout&lt;&lt;str&lt;&lt;endl;//显示宽字符数组，下同<br />wprintf(str);</p>
<p>system("pause");</p>
<p>wchar_t 转换为char 的代码如下：</p>
<p>有如下的wchar_t和char变量</p>
<p>wchar_t w_cn = '中';<br />char c_cn[2] = {'0'} ;</p>
<p>char *C2W(wchar_t w_cn , char c_cn[2])</p>
<p>{</p>
<p>//following code convert wchar to char<br />c_cn[0] = w_cn &gt;&gt; 8 ;<br />c_cn[1] = w_cn ;<br />c_cn[2] = '\0';</p>
<p>return c_cn ;</p>
<p>}</p>
<p>其中需要注意的是一个16位的wchar_t需要用两个8位的char来存储之。我们可以发现另外一个问题，wchar_t的高位字节应该存储在char数组的低位字节。</p>
<p>wchar_t *类型 转为char *类型</p>
<p>&nbsp;CString strName("listen");<br />&nbsp;char *pcstr = (char *)new char[2 * strName.GetLength()+1] ;</p>
<p>&nbsp;WideCharToMultiByte(&nbsp;&nbsp; CP_ACP,&nbsp;&nbsp; <br />&nbsp; 0,&nbsp;&nbsp; <br />&nbsp; strName,&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 要转换的wchar_t*&nbsp;&nbsp; <br />&nbsp; -1,&nbsp;&nbsp; <br />&nbsp; pcstr,&nbsp;&nbsp; //&nbsp;&nbsp; 接收char*的缓冲区指针&nbsp;&nbsp; <br />&nbsp; 2 * strName.GetLength()+1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; pcstr的缓冲区的大小&nbsp;&nbsp; <br />&nbsp; NULL,&nbsp;&nbsp; <br />&nbsp; NULL&nbsp;&nbsp; );</p>
<p>关于system（"command"）</p>
<p>system("command")是执行一个dos命令。system("pause")就是执行Dos命令pause，等待用户输入。 <br />system("pause") 与getchar()区别</p>
<p>system("pause") 是调用WINDOWS CONSOLE APP下的命令 PAUSE的。 <br />system("const char*")就是调用WINDOWS CONSOLE APP下的命令。 <br />比如system("exit"); <br />system("ping 192.168.0.1")等等 </p>
<p>而getchar()只是C标准库里等待一个字符的函数，两者区别很大。</p>
<p>/*---------------------------------------------------*/<br />如何使system("pause") 不弹出&#8220;按任意键继续&#8221;这几个字呢？<br />用system("pause&gt;nul")&nbsp; 就可以了</p>
<p>wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString</p>
<p>#include &lt;string&gt;<br />// 使用CString必须使用MFC，并且不可包含&lt;windows.h&gt;<br />#define _AFXDLL<br />#include &lt;afx.h&gt;<br />using namespace std;<br />//----------------------------------------------------------------------------------<br />//将 单字节char* 转换为 宽字节 wchar*<br />inline wchar_t* AnsiToUnicode( const char* szStr )<br />{<br />int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );<br />if (nLen == 0)<br />{<br />&nbsp;&nbsp; return NULL;<br />}<br />wchar_t* pResult = new wchar_t[nLen];<br />MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );<br />return pResult;<br />}<br />//----------------------------------------------------------------------------------<br />// 将 宽字节wchar_t* 转换 单字节char*<br />inline char* UnicodeToAnsi( const wchar_t* szStr )<br />{<br />int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );<br />if (nLen == 0)<br />{<br />&nbsp;&nbsp; return NULL;<br />}<br />char* pResult = new char[nLen];<br />WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );<br />return pResult;<br />}<br />//----------------------------------------------------------------------------------<br />// 将单字符 string 转换为宽字符 wstring<br />inline void Ascii2WideString( const std::string&amp; szStr, std::wstring&amp; wszStr )<br />{<br />int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );<br />wszStr.resize(nLength);<br />LPWSTR lpwszStr = new wchar_t[nLength];<br />MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );<br />wszStr = lpwszStr;<br />delete [] lpwszStr;<br />}<br />//----------------------------------------------------------------------------------<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />char*&nbsp;&nbsp; pChar = "我喜欢char";<br />wchar_t* pWideChar = L"我讨厌wchar_t";<br />wchar_t&nbsp;&nbsp; tagWideCharList[100] ;<br />char&nbsp;&nbsp; ch = 'A';<br />char&nbsp;&nbsp; tagChar[100] = {NULL};<br />CString&nbsp;&nbsp; cStr;<br />std::string str;</p>
<p>// 注：设置语言环境以便输出WideChar<br />setlocale(LC_ALL,"chs");</p>
<p>// 注： char* 转换 wchar_t*<br />// 注： wchar_t 未重载 &lt;&lt; ，所以不可使用 cout &lt;&lt; 输出<br />pWideChar = AnsiToUnicode( pChar );<br />// 注：printf("%ls") 和 wprintf(L"%s") 一致<br />printf( "%ls\n", pWideChar ); </p>
<p>// 注：wchar_t* 转换 wchar_t[]<br />wcscpy ( tagWideCharList, pWideChar );<br />wprintf( L"%s\n", tagWideCharList );</p>
<p>// 注：wchar_t[] 转换 wchar_t*<br />pWideChar = tagWideCharList;<br />wprintf( L"%s\n", pWideChar );</p>
<p>// 注：char 转换 string<br />str.insert( str.begin(), ch );<br />cout &lt;&lt; str &lt;&lt; endl;</p>
<p>// 注：wchar_t* 转换 string<br />pWideChar = new wchar_t[str.length()];<br />swprintf( pWideChar, L"%s", str.c_str());<br />wprintf( L"%s\n", pWideChar );</p>
<p>// 注：string 转换 char*<br />pChar = const_cast&lt;char*&gt;(str.c_str());<br />cout &lt;&lt; pChar &lt;&lt; endl;</p>
<p>// 注：char* 转换 string<br />str = std::string(pChar);<br />// 注： cout 的 &lt;&lt; 重载了string, 若printf 的话必须 printf("%s", str.c_str()); <br />//&nbsp;&nbsp; 而不可 print( "%s", str ); 因为 str 是个 string 类<br />cout &lt;&lt; str &lt;&lt; endl;</p>
<p>// 注：string 转换 char[]<br />str = "无聊啊无聊";<br />strcpy( tagChar, str.c_str() );<br />printf( "%s\n", tagChar );</p>
<p>// 注：string 转换 CString;<br />cStr = str.c_str();</p>
<p>// 注：CString 转换 string <br />str = string(cStr.GetBuffer(cStr.GetLength()));</p>
<p>// 注：char* 转换 CString<br />cStr = pChar;</p>
<p>// 注：CString 转换 char*<br />pChar = cStr.GetBuffer( cStr.GetLength() );</p>
<p>// 注：CString 转换 char[]<br />strncpy( tagChar, (LPCTSTR)CString, sizeof(tagChar));</p>
<p>// 注：CString 转换 wchar_t*<br />pWideChar = cStr.AllocSysString();<br />printf( "%ls\n", pWideChar );<br />}</p>
<p>WideCharToMultiByte()函数</p>
<p>　　函数功能：该函数映射一个unicode字符串到一个多字节字符串。</p>
<p>　　函数原型：int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, LPCSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, PBOOL pfUsedDefaultChar );</p>
<p>　　参数：</p>
<p>　　CodePage：指定执行转换的代码页，这个参数可以为系统已安装或有效的任何代码页所给定的值。你也可以指定其为下面的任意一值：</p>
<p>　　CP_ACP：ANSI代码页；CP_MACCP：Macintosh代码页；CP_OEMCP：OEM代码页；</p>
<p>　　CP_SYMBOL：符号代码页（42）；CP_THREAD_ACP：当前线索ANSI代码页；</p>
<p>　　CP_UTF7：使用UTF-7转换；CP_UTF8：使用UTF-8转换。</p>
<p>　　dwFlags：一组位标记用以指出是否未转换成预作或宽字符（若组合形式存在），是否使用象形文字替代控制字符，以及如何处理无效字符。你可以指定下面是标记常量的组合，含义如下：</p>
<p>　　MB_PRECOMPOSED：通常使用预作字符&#8212;&#8212;就是说，由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与</p>
<p>　　MB_COMPOSITE值一起使用。</p>
<p>　　MB_COMPOSITE：通常使用组合字符&#8212;&#8212;就是说，由一个基本字符和一个非空字符组成的字符分别有不同的字符值。这是缺省的转换选择。不能与MB_PRECOMPOSED值一起使用。</p>
<p>　　MB_ERR_INVALID_CHARS：如果函数遇到无效的输入字符，它将运行失败，且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。</p>
<p>　　MB_USEGLYPHCHARS：使用象形文字替代控制字符。</p>
<p>　　组合字符由一个基础字符和一个非空字符构成，每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符&#232;中，e就是基础字符，而重音符标记就是非空字符。</p>
<p>　　函数的缺省动作是转换成预作的形式。如果预作的形式不存在，函数将尝试转换成组合形式。</p>
<p>　　标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的，而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。</p>
<p>　　lpWideCharStr：指向将被转换的unicode字符串。</p>
<p>　　cchWideChar：指定由参数lpWideCharStr指向的缓冲区的字符个数。如果这个值为-1，字符串将被设定为以NULL为结束符的字符串，并且自动计算长度。</p>
<p>　　lpMultiByteStr：指向接收被转换字符串的缓冲区。</p>
<p>　　cchMultiByte：指定由参数lpMultiByteStr指向的缓冲区最大值（用字节来计量）。若此值为零，函数返回lpMultiByteStr指向的目标缓冲区所必需的字节数，在这种情况下，lpMultiByteStr参数通常为NULL。</p>
<p>　　lpDefaultChar和pfUsedDefaultChar：只有当WideCharToMultiByte函数遇到一个宽字节字符，而该字符在uCodePage参数标识的代码页中并没有它的表示法时，WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换，该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL（这是大多数情况下的参数值），那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的，因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量，如果Unicode字符串中至少有一个字符不能转换成等价多字节字符，那么函数就将该变量置为TRUE。如果所有字符均被成功地转换，那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后，可以测试该变量。</p>
<p>　　返回值：如果函数运行成功，并且cchMultiByte不为零，返回值是由 lpMultiByteStr指向的缓冲区中写入的字节数；如果函数运行成功，并且cchMultiByte为零，返回值是接收到待转换字符串的缓冲区所必需的字节数。如果函数运行失败，返回值为零。若想获得更多错误信息，请调用GetLastError函数。它可以返回下面所列错误代码：</p>
<p>　　ERROR_INSUFFICIENT_BJFFER；ERROR_INVALID_FLAGS；</p>
<p>　　ERROR_INVALID_PARAMETER；ERROR_NO_UNICODE_TRANSLATION。</p>
<p>　　注意：指针lpMultiByteStr和lpWideCharStr必须不一样。如果一样，函数将失败，GetLastError将返回ERROR_INVALID_PARAMETER的值。</p>
<p>ANSI和UNICODE编码</p>
<p>二者都是字符代码的一种表示形式</p>
<p>ANSI编码用0x88~0xFF范围的2个字节来表示1个字符。</p>
<p>Unicode编码是国际组织指定的可以容纳世界上所有文字和服的字符的字符编码方案。用数字0~0x10FFFF来映射这些字符。</p>
<p>我的理解：说白了，ANSI编码是单字节，Unicode编码是宽字符。</p>
<p><br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/chocolateconanlan/archive/2009/04/09/4058868.aspx"><font color="#6466b3">http://blog.csdn.net/chocolateconanlan/archive/2009/04/09/4058868.aspx</font></a></p></div><img src ="http://www.cppblog.com/dotaqop/aggbug/148054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dotaqop/" target="_blank">Hsssssss</a> 2011-06-04 17:00 <a href="http://www.cppblog.com/dotaqop/articles/148054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>