MFC

这有一段代码
CFont NewFont;
NewFont.CreateFont( 50, 0, 100, 0, FW_BOLD, TRUE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, "Arial" );
CFont* pOldFont = pDC -> SelectObject( &NewFont );
pDC -> TextOut( 0, 200, "hello!" );
pDC -> SelectObject( pOldFont );在VC 6.0中没有错误,在VS 2010中竟然出现了两个致命错误!
如下:
error C2664: “CFont::CreateFontW”: 不能将参数 14 从“const char [6]”转换为“LPCTSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>e:\c ++\vs 2010\china\china\chinaview.cpp(66): error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“const char [7]”转换为“const CString &”
1>          原因如下: 无法从“const char [7]”转换为“const CString”
1>          class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
1>          with
1>          [
1>              BaseType=wchar_t,
1>              StringTraits=StrTraitMFC_DLL<wchar_t>
1>          ]希望大家帮帮忙,解释解释!

解决方案 »

  1.   

    vs2010是unicode环境的字符串都得加上_T("")或L""才行CFont NewFont;
    NewFont.CreateFont( 50, 0, 100, 0, FW_BOLD, TRUE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, L"Arial" );
    CFont* pOldFont = pDC -> SelectObject( &NewFont );
    pDC -> TextOut( 0, 200, L"hello!" );
    pDC -> SelectObject( pOldFont );
      

  2.   

    谢谢了!刚才加了一个'L’确实对了!
    请问”vs2010是unicode环境的“是什么意识啊?
      

  3.   

    还有,刚才把’L‘换成了’T‘为什么不对啊?
    还是那个问题:”vs2010是unicode环境的“是什么意识啊?
      

  4.   

    "Arial"
    改为:
    _T("Arial")
      

  5.   

    嗯,谢了!写成_T("Arial")种形式确实对了!
    不过真的想知道“vs2010是unicode环境的”是什么意识?
    nuicode???
      

  6.   

    我刚开始也是这个问题,有两种方法解决;
    1:单击vs2010菜单中的项目选项-》项目属性-》配置属性-》常规,然后在项目默认值其中的字符集中选“未设置”,点击确定。
    2:在所有的字符串添加_T("字符串")转为系统默认字符编码格式。
    说明:vs2010默认字符编码格式是Unicode,每个字符占2字节(8位),而vc6.0是ACSII码,每个字符占一个字节。
    class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”估计是使用活动模板库,声明格式不正确。
      

  7.   

    不过也想知道这两种形式是什么意识?( L,_T( a )? )
      

  8.   

    _T是宏 定义如下
    #define _T(x)      L ## x
    在UNICODE环境下
    _T("hello") 等于 L"hello"
    但是当MBCS环境下
    _T("hello") 不等于 L"hello" 了,而是等于 "hello"
    平时应该用_T宏,更通用了
      

  9.   

    谢谢大家了!差不多明白了!
    这是网上看到的关于Unicode的一些东西:
    Unicode(统一码、万国码、单一码、标准万国码)是计算机科学领域里的一项业界标准,用以统一地体现和处理世界上大部分的文字系统,并为其编码。
     
    Unicode依照通用字符集(Universal Character Set)的标准来发展,同时也以书本的形式[1]对外发表。Unicode至今仍在不断扩增,每个新版本都加入更多新的字符。目前最新的Unicode第六版,除了已纳入超过十万个字符(Unicode的第十万个字符在2005年获采纳,且认可成为标准之一),还包含可用作视觉参考的代码图表、编码方法、标准的字符编码,以及记录了如大小写字母等字符特性的列表这些数据。
     
    负责监督Unicode发展的非营利机构统一码联盟,致力于让Unicode编码方案取代既有的字符编码方案,因为后者往往仅有有限的空间,亦不适用于多语环境。
     
    Unicode备受认可,并广泛地应用于电脑软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言,以及现代的操作系统,都采用Unicode编码。
     
    目录
      [隐藏]  1 起源与发展 1.1 标准
     1.2 历史
     
    2 Unicode的编码和实现 2.1 编码方式
     2.2 实现方式
     2.3 Unicode字符平面映射
     
    3 非Unicode环境
     4 XML和Unicode
     5 输入方法 5.1 中文输入法
     5.2 日文输入法
     5.3 其他
     
    6 汉字问题
     7 Unicode编码表
     8 相关条目
     9 外部链接
     10 注释
     [编辑] 起源与发展
     
    Unicode 是为了解决传统的字符编码方式的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都具有一个共同的问题,即其容许电脑进行双语环境式的处理(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境式的处理(指可同时处理混合多种语言的情况)。
     
    Unicode 编码包含了不同写法的字,如“a / a”、“強/强”、“戶/户/戸”。然而在汉字方面引起了一字多形的认定争议(详见中日韩统一表意文字主题)。
     
    在文字处理方面,Unicode 的功用是为每一个字符提供一个唯一的代码(即一组数字),而不是一种字形。换句话说,Unicode是将字符以一种抽象的方式来体现,而将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。
     
    差不多所有电脑系统都支持基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首256字符保留给ISO 8859-1所定义的字符,使既有的西欧语系文字的转换不需特别考量;并且把大量相同的字符重复编到不同的字符码中去,使得旧有纷杂的编码方式得以和Unicode编码间互相直接转换,而不会丢失任何信息。举例来说,全角格式区段包含了主要的拉丁字母的全角格式,在中文、日文、以及韩文字形当中,这些字符以全角的方式来体现,而不以常见的半角形式显示,这对竖排文字和等宽排列文字有重要作用。
     
    在表达一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。
     
    [编辑] 标准
     
    位于美国加州的Unicode组织允许任何愿意支付会员费用的公司或是个人加入,其成员包含了主要的电脑软硬件厂商,例如奥多比系统、苹果公司、惠普、IBM、微软、施乐等。
     
    1980年代末,组成Unicode组织的商业机构,和国际合作的国际标准化组织(International Organization for Standardization,简称ISO)因为电脑普及和信息国际化的前提下,分别各自成立了Unicode组织[2]和ISO-10646工作小组。他们不久便发现对方机构的存在,大家为着相同的目的而工作,于是两个组织便共同合作开发适用于各国语言的通用码,而且“相当有默契地”各自发表Unicode和ISO-10646字集。虽然实际上两者的字集编码相同,但实质上两者确实为两个不同的标准。
     
    Unicode组织在1991年首次发布了The Unicode Standard。Unicode的开发结合了国际标准化组织(简称ISO)所制定的ISO/IEC 10646,即通用字符集(Universal Character Set,简称UCS)。Unicode与ISO/IEC 10646在编码的运作原理相同,但The Unicode Standard 包含了更详尽的实现信息、涵盖了更细节的主题,诸如字符编码(bitwise encoding)、校对以及体现等。The Unicode Standard 也枚举了诸多的字符特性,包含了那些必须支持两种阅读方向的文字(由左至右或由右至左的文字阅读方向,例如阿拉伯文是由右至左)。Unicode与ISO/IEC 10646两个标准在术语上的使用有些微的不同。
     
    在西元2005年,Unicode的第十万个字符被输入成为标准之一,其为马来亚拉姆语(Malayalam,印度西南部沿海居民的语言)的Praslesham(പ്രശ്ലേഷം)。
     
    [编辑] 历史
     
    Unicode截至目前为止历次的版次与发布时间如下:
     Unicode 1.0:1991年10月
     Unicode 1.0.1:1992年6月
     Unicode 1.1:1993年6月
     Unicode 2.0:1997年7月
     Unicode 2.1:1998年5月
     Unicode 2.1.2:1998年5月
     Unicode 3.0:1999年9月;涵盖了来自ISO 10646-1的十六比特通用字符集(UCS)基本多文种平面(Basic Multilingual Plane)
     Unicode 3.1:2001年3月;新增从ISO 10646-2定义的辅助平面(Supplementary Planes)
     Unicode 3.2:2002年3月
     Unicode 4.0:2003年4月
     Unicode 4.0.1:2004年3月
     Unicode 4.1:2005年3月
     Unicode 5.0:2006年7月
     Unicode 5.1:2008年4月
     Unicode 5.2:2009年10月
     Unicode 6.0:2010年10月
     
    [编辑] Unicode的编码和实现
     
    大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。
     
    [编辑] 编码方式
     
    Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,目前实际应用的Unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216即65536个字符。基本满足各种语言的使用。实际上当前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。
     
    上述16位Unicode字符构成基本多文种平面(Basic Multilingual Plane,简称BMP)。最新(但未实际广泛使用)的Unicode版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会扩充到ISO 10646-1实现级别3,即涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。
     
    BMP字符的Unicode编码表示为U+hhhh,其中每个h 代表一个十六进制数位。与UCS-2编码完全相同。对应的4字节UCS-4编码后两个字节一致,前两个字节的所有位均为0。
     
    关于Unicode和ISO 10646及UCS的详细关系 ,请参看通用字符集。
     
    [编辑] 实现方式
     
    Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)
     
    例如,如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大大节省了编码长度(具体方案参见UTF-8)。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。
     
    再如,如果直接使用与Unicode编码一致(仅限于BMP字符)的UTF-16编码,由于每个字符占用了两个字节,在Macintosh (Mac)机和PC机上,对字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如某字符为十六进制编码4E59,按两个字节拆分为4E和59,在Mac上读取时是从低字节开始,那么在Mac OS会认为此4E59编码为594E,找到的字符为“奎”,而在Windows上从高字节开始读取,则编码为U+4E59的字符为“乙”。就是说在Windows下以UTF-16编码保存一个字符“乙”,在Mac OS环境下打开会显示成“奎”。此类情况说明UTF-16的编码顺序若不加以人为定义就可能发生混淆,于是在UTF-16编码实现方式中使用了大端序(Big-Endian, 简写为UTF-16 BE)、小端序(Little-Endian,简写为UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案,目前在PC机上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。(具体方案参见UTF-16)
     
    此外Unicode的实现方式还包括UTF-7、Punycode、CESU-8、SCSU、UTF-32等,这些实现方式有些仅在一定的国家和地区使用,有些则属于未来的规划方式。目前通用的实现方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。在微软公司Windows XP附带的记事本(Notepad)中,“另存为”对话框可以选择的四种编码方式除去非Unicode编码的ANSI(对于英文系统即ASCII编码,中文系统则为GB2312或Big5编码) 外,其余三种为“Unicode”(对应UTF-16 LE)、“Unicode big endian”(对应UTF-16 BE)和“UTF-8”。
     
    目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字中,因此包括GBK、GB18030、Big5等简体中文、繁体中文、日文、韩文以及越南喃字的各种编码与Unicode的协调性被重点关注。考虑到Unicode最终要涵盖所有的字符,从某种意义而言,这些编码方式也可视作Unicode的出现于其之前的既成事实的实现方式,如同ASCII及其扩展Latin-1一样,后两者的字符在16位Unicode编码空间中的编码第一字节各位全为0,第二字节编码与原编码完全一致。但上述东亚语言编码与Unicode编码的对应关系要复杂得多。
     
    [编辑] Unicode字符平面映射
     
    主条目:Unicode字符平面映射
     
    [编辑] 非Unicode环境
     
    在非Unicode环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非Unicode的字符编码转换为同一字符对应的系统内部使用的Unicode编码。可以在“语言与区域设置”中选择一个代码页作为非Unicode编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。
     
    代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000,UTF-8的代码页是65001。
     
    [编辑] XML和Unicode
     
    XML及其子集XHTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进制Unicode代码。如果采用十六进制代码,在编码之前加上x字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。
     
    过去电脑编码的8位标准,使每个国家都只按国家使用的字符而编定各自的编码系统;而对于部份字符系统比较复杂的语言,如越南语,又或者东亚国家的大型字符集,都不能在8位的环境下好好显示。若连自己的语言也未必可以好好显示,遑论显示其他国家的文字。然而,现在于HTML和XML,我们可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进位Unicode代码。如果想采用十六进位代码的话,要在编码之前加上x字符。
     
    只是最近才有在文本中对十六进制的支持,那么旧版本的浏览器显示那些字符或许可能有问题-大概首先会遇到的一个问题只是在对于大于8位Unicode字符的显示。解决这个问题的普遍做法仍然是将其中的十六进制码转换成一个十进制码(例如:用&#9824;代替&#x2660;)。
     
    也有一些字符集标准将一些常用的标志存放在字符内码外面,那么你可能使用象&mdash;这样的文本标志来表示一个长划(—)的情况,即使它的字符内码已经被使用,这些标准也不包含那个字符。
     
    然而部分由于Unicode版本发展原因,很多浏览器只能显示UCS-2完整字符集,也即现在使用的Unicode版本中的一个小子集。下表可以检验您的浏览器怎样显示各种各样的Unicode代码:
     
    代码
     
    字符标准名称(英语)
     
    在浏览器上的显示
     
    &#65;
     
    大写拉丁字母"A"
     
    A
     
    &#223;
     
    小写拉丁字母"Sharp S"
     
    ß
     
    &#254;
     
    小写拉丁字母"Thorn"
     
    þ
     
    &#916;
     
    大写希腊字母"Delta"
     
    Δ
     
    &#1049;
     
    大写斯拉夫字母"Short I"
     
    Й
     
    &#1511;
     
    希伯来字母"Qof"
     
    ק
     
    &#1605;
     
    阿拉伯字母"Meem"
     
    م
     
    &#3671;
     
    泰文数字7
     

     
    &#4688;
     
    埃塞俄比亚音节文字"Qha"
     

     
    &#12354;
     
    日语平假名"A"
     

     
    &#12450;
     
    日语片假名"A"
     

     
    &#21494;
     
    简体汉字"叶"
     

     
    &#33865;
     
    正体汉字"葉"
     

     
    &#50685;
     
    韩国音节文字"Yeob"
     

     一些多语言支持的网页浏览器,比如微软Windows系统的Internet Explorer 5.5,以及跨平台的浏览器Mozilla/Netscape 6,可以在安装时根据需要动态地使用相应的字符集,预先安装了合适的语言包,就可以同时显示页面上的各种Unicode字符。IE 5.5还提出用户可以在需要新字体时,即装即用。另外的浏览器如Netscape Navigator 4.77,则只能显示跟页面编码相应字符集中的文字。当你使用后一种浏览器时,你不大可能预先安装所有的字体,即使有了字体,浏览器也不一定能将这些字体完全应用起来。可能遇到的情况是,这种浏览器只能够显示部分文字,因为它们是按照标准进行编码,尽管理论上在兼容的系统中,只要有了相应的字体,就可以正确显示。一种变通的办法,是将某些少见的字符,通过“名称实体引用”的方式来使用。
     
    [编辑] 输入方法
     
    [编辑] 中文输入法
     
    截至2011年10月,可以使用微软拼音2003或2007版本,仓颉输入法第三代第五代第六代版本,郑码unicode版本,海峰五笔9.3版本,新注音输入法和VimIM进行输入。
     微软拼音在输入法启动状态下,单击语言栏上的“功能菜单”按钮,指向“辅助输入法”即可发现“Unicode码输入方式”,利用它可以直接输入Unicode相应十六进制值的方式输入相应文字。例如中文“胥”输入“5066”,朝鲜文字“셅”输入“c145”(不需要在前面加0x或x)。
     仓颉输入法已为unicode汉字,类汉字编码,可以在仓颉输入法方式下通过仓颉码输入方式输入unicode内的中日韩汉字及韩文。以仓颉输入法第五代为例,例如汉字“㗎”输入“口大口木”,汉字“胥”输入“弓人月”,汉字“㿱”输入“手中木竹水”,朝鲜文字“닮”输入“尸卜尸女口”。
     郑码已为unicode汉字,类汉字编码,可以在郑码输入法方式下通过郑码字码输入方式输入unicode内的中日韩汉字及韩文。例如汉字“㗎”输入“JYJF”,汉字“胥”输入“XIQ”,汉字“㿱”输入“DPXI”,朝鲜文字“셅”输入“ODYH”。
     海峰五笔此输入法已经直接支持通过五笔码输入方式输入Unicode内的任意中日韩汉字,但无法使用键入Unicode码的方式输入。例如汉字(Unicode部分)“㗎”为“keks”,CJK扩展B区的“㿱”为“iyho”和CJK扩展C区的“뇛”为“muih”。
     新注音输入法在输入法启动状态时,打入键盘上的“多功能前导字符键”(及通用键盘上之“`”),第一次使用会弹出说明。输入Unicode字符“胥”则是在键盘上键入“`U5066”。而韩语中的“셅”,则输入“`UC145”。而要输入日语自制汉字“卡”,则是“`U5CE0”。
     VimIM在Vim环境中,可以直接键入十进制或十六进制Unicode码。既不需要启动输入法,也不需要码表。
     
    [编辑] 日文输入法
     
    使用Microsoft IME 2007,可以在IME PAD里找到UNICODE的点击表。点击字符即可输入。选择字体可以预览字符效果。
     
    [编辑] 其他
     
    除了输入法外,操作系统也会提供另外几种方法输入Unicode。像是Windows 2000之后的Windows系统就提供一个可点击的字符映射表。又或者在Microsoft Word下,按下Alt键不放,输入0和某个字符的Unicode编码(十进制),再松开Alt键即可得到该字符,如Alt + 033865会得到Unicode字符叶。另外按Alt + X组合键,MS Word也会将光标前面的字符同其十六进制的四位Unicode编码进行互相转换。
     
    [编辑] 汉字问题
     
    Unicode的汉字处理方法一直备受抨击。有指这种把数万汉字逐一编码的方式,非常浪费资源,要把汉字加到Unicode标准中也不容易。也有批评处理Unicode中汉字编码的专家,并不是真正研究汉字的学者。从早期的中文电脑时期开始,已有研究以部件产生汉字(动态组字),取代汉字逐一编码方法。
    这有一个站点:http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84是关于Unicode编码介绍,很不错的!
      

  10.   

    谢谢了!
    刚接触MFC觉得太大了,什么都看不到似的,也许某天到达山顶会有一种一览众山小的感觉的!