保存在CString里面的字符难道就只是Ansi吗?不能存为Unicode吗?
CString str;
str=_T("阿瑟多幅阿瑟多幅");
MessageBox(str.Left(6));结果是"阿瑟多"
还是不对啊,应该是"阿瑟多幅阿瑟"啊,救命啊!!

解决方案 »

  1.   

    我认为是这样的,你需要用BSTR来保存unicode的字符。
      

  2.   

    谁能给我一个例子,就是把一条CString以unicode编码的形式把字符串切开.
    例如:
    CString str="abc中华erwer阿瑟多幅";
    以5个为单位切开则为:
    "abc中华","erwer","阿瑟多幅"请大家给一个例子!
      

  3.   

    MFC7.0中使用CStringW来处理保存Unicode
    VC6中一般用BSTR或者Varent
    MSDN2003:
     Visual C++ 概念:添加功能   Unicode 和多字节字符集 (MBCS) 支持请参见
    字符串
    有些国际市场以大字符集来使用日文和中文等语言。为了支持这些市场的编程,Microsoft 基础类库 (MFC) 支持以两种方式处理大字符集: Unicode 
    多字节字符集 (MBCS) 
    Unicode 字符串的 MFC 支持
    整个类库有条件地支持 Unicode 字符和字符串。特别是 CString 类也支持 Unicode。注意   MFC 库的 Unicode 版本不会复制到硬盘上,除非您在“自定义”安装时选择它们。在其他类型的安装过程中不会复制它们。如果试图在没有 MFC Unicode 文件的情况下生成或运行 MFC Unicode 应用程序,可能会出现错误。
    要将这些文件复制到硬盘上,请重新运行安装程序并单击“添加/移除功能”。单击“语言工具”,单击“Visual C++”并单击“Visual C++ 类和模板库”,然后选择“ATL MFC 共享库 Unicode”和“ATL MFC 静态库 Unicode”。这会将以下文件复制到硬盘上:
    UAFXCW.LIB UAFXCW.PDB UAFXCWD.LIB UAFXCWD.PDB 
    MFCxxU.LIB MFCxxU.DBG MFCxxU.DLL MFCxxUD.LIB 
    MFCxxUD.PDB MFCxxUD.DLL MFCDxxUD.LIB MFCDxxUD.PDB 
    MFCDxxUD.DLL MFCNxxUD.LIB MFCNxxUD.PDB MFCNxxUD.DLL 
    MFCOxxUD.LIB MFCOxxUD.PDB MFCOxxUD.DLL   其中“xx”表示文件的版本号,例如“70”表示 7.0 版本。CString 是基于 TCHAR 数据类型的。如果为程序的生成定义了符号 _UNICODE,则会将 TCHAR 定义为 wchar_t 类型(一个 16 位的字符编码类型);否则,会将它定义为 char(普通的 8 位字符编码)。于是,在 Unicode 下,CString 由 16 位字符组成。如果没有 Unicode,它们则由 char 类型的字符组成。要完成应用程序的 Unicode 编程,还必须: 使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。 
    当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。 
    使用 C 运行时字符串处理函数的可移植版本。 
    使用以下用于字符和字符指针的数据类型: 
    TCHAR   这里将使用 char。 
    LPTSTR   这里将使用 char*。 
    LPCTSTR   这里将使用 const char*。CString 提供 operator LPCTSTR 来在 CString 和 LPCTSTR 之间进行转换。 
    CString 还提供识别 Unicode 的构造函数,赋值运算符和比较运算符。有关 Unicode 编程的相关信息,请参见 Unicode 和 MBCS 和 Unicode 主题。《运行时库参考》中定义了所有字符串处理函数的可移植版本。请参见类别国际化。MBCS 字符串的 MFC 支持
    类库还支持多字节字符集,特别是双字节字符集 (DBCS)。在这一方案下,字符的宽度可以是一个字节,也可是两个字节。如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。如果为程序的生成定义了符号 _MBCS,则类型 TCHAR(CString 基于该类型)将映射到 char。由您来决定 CString 中的哪些字节是前导字节,哪些字节是尾字节。C 运行时库提供函数来帮助您进行确定。在 DBCS 下,给定的字符串可以包含所有的单字节 ANSI 字符、所有的双字节字符或两者的组合。这些可能性需要您在分析字符串(包括 CString 对象)时要备加小心。注意   MFC 中的 Unicode 字符串序列化能够读取 Unicode 和 MBCS 字符串,而不论运行的是哪个版本的应用程序。正因为如此,数据文件在程序的 Unicode 和 MBCS 版本之间是可移植的。
    CString 成员函数使用其调用的 C 运行时库特殊的“一般文本”版本,或使用识别 Unicode 的函数,如 lstrlen 或 lstrcpy。因此,如果 CString 函数通常情况下调用 strcmp,那么它会调用相应的一般文本函数 _tcscmp。根据符号 _MBCS 和 _UNICODE 定义方式的不同,_tcscmp 映射如下:_MBCS 已定义 _mbscmp 
    _UNICODE 已定义 wcscmp 
    两者都未定义 strcmp 注意   符号 _MBCS 和 _UNICODE 是互相排斥的。
    《运行时库参考》中对所有运行时字符串处理例程的一般文本函数映射作了详细的介绍。请参见类别国际化。同样地,CString 成员函数是使用“一般”数据类型映射来实现的。要启用 MBCS 和 Unicode,MFC 使用 TCHAR 映射 char、LPTSTR 映射 char* 并使用 LPCTSTR 映射 const char*。这会得到 MBCS 或 Unicode 的正确映射。
      

  4.   

    一个Unicode字符的长度是2字节。
    CString str;
    str=_T("阿瑟多幅阿瑟多幅");
    MessageBox(str.Left(6*2));
      

  5.   

    Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以以UNICODE方式保存。 
         这有详细介绍
    http://www.csdn.net/develop/article/18/18009.shtm
      

  6.   

    CString str=_T("阿瑟多幅阿瑟多幅");
    BSTR bstr=str.SysAllocString();
    这里面的BSTR就是UNICODE文本了用完以后要SysFreeString(bstr);
    ————————————————————————————————————
    还有一种方式:,这样的话CString里面存放的就是UNICODE文本了,但缺点是不能在win98里面使用!另外你的VC也要完全安装,否则会提示缺少库0).1.改语言定义:
    在project settings的"C++"页中的"preprocessor definitions"中改_MBCS为_UNICODE
    (0).2.改入口函数:
    在"link"页中的"project Options"加入/entry:"wWinMainCRTStartup"