VC里,代码文件都是ascii格式的,就是一个字符用一个字节表示,但是现在的系统都是Unicode格式的。是不是TEXT("")把ascii字符串转换成Unicode字符串的呢?要是"abc"这样的字符串好办,只要在高字节补0就可以,但是中文字符呢?怎么处理的?比如TEXT("我们"),是谁负责把国标码转换成Unicode的?

解决方案 »

  1.   

    代码文件也要用unicode格式,这样才能正确显示中文等,
    然后使用 TEXT等宏,用宽字符表示,两个字节表示一个字符
      

  2.   

    unicode用2个字节表示一个字符
    ansi用1个字节unicode表示字符的方法   wchar_t txt[] = L"unicode";   // 会占用 (7+1)*2个字节
            ~~~~~~~
    ansi                 char txt[] = "ansi";           // ~~~~~~(4+1)*1~~~~~TEXT("xxx"), _T("xxx") 在不同的工程设置下可代表不同的字符类型。如果定义了UNICODE,则展开为unicode格式的字符串 L"xxx"; 如果没有定义,则展开为ansi格式的字符串 "xxx"
      

  3.   

    源本身有存储格式,可执行程序也分unicode/ansi
      

  4.   

    可能大家没明白我的意思,vc里,代码源文件是ascii格式的,遇到汉字用的是gb码
    TCHAR str[] = TEXT("我们");
    用UltraEdit打开源文件代码,发现"我们"用的是gb表示的,谁把gb码转换成Unicode的呢?
    比如MessageBoxW(NULL, str, 0, 0),结果是对的,但是这个函数要求的是Unicode,谁转换的呢?
      

  5.   


    你确信你说的都是真的?假如你的工程是unicode的,那是对的,如果没定义_UNICODE宏呢?
      

  6.   

    MSDN中有个转换成宽字符的函数
      

  7.   


    在Window Xp下用 vs2008,当然定义了_UNICODE, windows2000或者windowXp都是_UNICODE了
      

  8.   

    楼主哇,俺一定不显示地声明使用哪个API,习惯不带A和W的使用方式:MessageBox
    这个适应性显然更好,至于是A还是W,由编译器去决定好了。字符串声明用_T(".........")就ok;而且,除非你准备你的程序跨平台使用,那用_UNICODE可以,否则,俺还是建议ANSI就ok了。有很多函数都是要求使用char,或者char*的参数。
      

  9.   

    这个适应性显然更好,至于是A还是W,由编译器去决定好了。字符串声明用_T(".........")就ok; 
    这个正确。。
      

  10.   


    1、源文件在VC中可以保存成Unicode格式。代码文件的处理是编译器的问题,由它进行处理。
    2、如果源文件是ANSI格式保存的,那么源文件中的“我们”以GB码保存,如果文件是Unicode的,以Unicode保存。
    3、源文件和程序是两回事。你这样调用MessageBoxW,因为在VS05以后,默认都是使用Unicode的,因此,TCHAR也是wchar_t。
       如果你在VC6或者选择了多字符集编译,那么会出错。
      

  11.   


    应该是VS08默认使用Unicode字符集进行编译,即定义了_UNICODE。
    Windows NT系列系统如2k,2k3,xp的内核都是Unicode的,即A系列函数最后是调用W的函数。
      

  12.   

    楼主这个问题问得好,说明你很细心啊。
    首先,VC里代码文件不一定是ASCII的,ASCII里面只能是0~127个字符,也许按照楼上说的MBCS更正确。因为我们肯定是可以在代码里敲中文的。
    那么编译器是如何处理中文的呢?有两种情况,对于较新的编译器如VS.NET2008,在文件另存为的时候,Save按钮旁边会有一个下拉箭头,里面有一个Save with Encoding...菜单,可以保存为Unicode。VC6等老得编译器不好说支不支持了。
    那么为什么默认的不是Unicode但也可以保存中文呢,这个与Windows的区域语言设置有关,编译器按照Windows区域语言里面非Unicode程序所使用的字符编码来解析代码文件。
    因为我们安装的是中文操作系统,这一选项默认是中文。例如我的Vista系统显示的是:Current language for non-Unicode programs: Chinese (Simplified, PRC)。你可以做一个尝试,在区域语言是中文的情况下,编写一段简单的程序,代码文件保存成非Unicode。例如:
    #include "stdafx.h"
    #include <windows.h>int _tmain(int argc, _TCHAR* argv[])
    {
    MessageBox(NULL, TEXT("测试"), TEXT("中文"), MB_OK);
    return 0;
    }然后将区域语言改为日文,重启电脑,打开上述程序,显示的就是乱码了。所以你的疑问恐怕是在于TEXT到底是告诉谁把什么转换成什么了,因为TEXT本身根据_UNICODE宏不同定义也不一样,所以我们不妨用L来描述吧。
    L"中文"是告诉编译器,在编译生成obj的时候,将"中文"转换成Unicode格式。
    如果.cpp文件本身就是Unicode的了,"中文"也就不需要被转换了,如果.cpp文件是ASCII的,那么编译器会根据Windows区域语言配置进行转换。
      

  13.   

    看了一些资料 TEXT("我们")在Unicode定义的情况下,相当于L"我们",就是说这个L能把GB码转换为Unicode码,但是L是C语言里的东西,在所有的编译器都好用,是不是所有的编译器对这个L定义都一样呢,就是把GB转换成Unicode。
      

  14.   


    L并不是把GB转换成Unicode,
    在Windows平台中,是把Windows设置中当前非Unicode程序默认编码转换为ucs2,也就是两字节的Unicode编码
    在*nix平台中,转换为ucs4,也就是4字节的Unicode编码。