程序语句:
MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
能够正常输出"你好,视窗操作系统!",但是在字符串前加上L,即:
MessageBoxA(NULL,L"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
结果产生乱码按理说"你好,视窗操作系统!"是UNICODE编码,的而MessageBoxA是输出ASCII编码的字符串的,第一个应该编译错误或乱码才对啊,应该8位一个字符输出。我用语句:MessageBoxA(NULL,L"helloworld",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);测试,发现只输出一个h。这是预料中的,但是上面两条语句是怎么执行的呢,其内部是怎样转换的?

解决方案 »

  1.   

    为什么非要编译出错?!“HelloMsg”是字符串,“豒閜婾閜婾閜”也是字符串,凭什么编译出错
      

  2.   

    HelloMsg转换成Unicode就是'H',0,'e',0,'l',0,'l',0,'M',0,'s',0,'g',0,0,0被当成NULL-Terminate字符串处理,遇到'H'后面的第一个0,就以为结束了呗。
      

  3.   

    HelloMsg转换成Unicode就是'H',0,'e',0,'l',0,'l',0,'M',0,'s',0,'g',0,0,0被当成NULL-Terminate字符串处理,遇到'H'后面的第一个0,就以为结束了呗。
      

  4.   

    "你好,视窗操作系统!"谁给你说是unicode编码,这是正经的GB码,看成ASCII码也没错
    其编码是C4 E3 BA C3 A3 AC CA D3 B4 B0 B2 D9 D7 F7 CF B5 CD B3转换成unicode之后的编码是60 4F 7D 59 0C FF C6 89 97 7A CD 64 5C 4F FB 7C DF 7Eunicode编码之后,被MessageBoxA当成ASCII码解释,出现看起来的乱码是很正常的。
      

  5.   

    按理说"你好,视窗操作系统!"是UNICODE编码,的而MessageBoxA是输出ASCII编码的字符串的,第一个应该编译错误或乱码才对啊,应该8位一个字符输出。
    ===========
    你上面的"你好,..."这个没有加L也没有加_T,怎么会是UNICODE编码呢?应该是ASCII编码的。所以第一个编译和执行都是正确的。
      

  6.   

    unicode编码之后,被MessageBoxA当成ASCII码解释,出现看起来的乱码是很正常的看清楚没有,被当成ASCII解释了。世界上本无所谓ASCII,UNICODE,对计算机来说都是数字,ASCII字符串的本质就是遇到0结束,没遇到0就继续往后找0.你给我一个char*指针,我不管它指向的是不是真的char*,反正按ASCII字符串一样往后找0就对了。
      

  7.   

    好吧,是GB码,但是第一个MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);却并没有乱码,还是能够显示中文,他如果按照ASCII码来解释的话,应该乱码啊,显示的应该是一串可视或不可视的ASCII字符,第二种乱码,显示的还是中文字符(也许不是中文,反正是象形文字)。我想知道,MessageBoxA是怎样工作的
      

  8.   

    看了半天,没明白楼主到底不明白什么
    MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);没有乱码,好好的它干嘛要乱码啊?
      

  9.   

    楼主弄错了一个问题,中文的编码叫多字节编码,它和ASCII是相兼容的。所以上面的:
    MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);不会乱码。
    如果写成这样:
    MessageBoxA(NULL,L"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    那么MessageBoxA会将"你好,...."这些UNICODE编码的字符解读为ASCII编码。此时就会产生乱码
      

  10.   

    我是这样想的,MessageBoxA是以8位ASCII的方式来读取字符串的,一个中文字符用两个字节表示,那MessageBoxA应该将一个中文字符读成是两个ASCII字符,但是他却能正确的读取两个字节组成的中文字符,为什么会这样。
      

  11.   

    ascii 码都是小于127的,,一个汉字 是2个字节,每个字节都大于 127 ,这样就能判断一个字节是汉字 还是字符。
      

  12.   

    MessageBoxA不是用来显示ASCII编码的字符串吗,难道他还会检查那串字符串,当8位编码大于128时,调用MessageBoxW?如果是这样的话,那第二条语句应该不会乱码啊。
      

  13.   

    MessageBoxA就是用来显示ASCII码,所以汉字英文数字直接写进去就行
    MessageBoxW就是用来显示Unicode,所以汉字英文数字前要加_T(汉字英文数字)就譬如一个函数要求输入参数是整形,但是你给它浮点数作为参数并不会编译错误,但是结果当然将浮点数进行了截断
      

  14.   

    我看你的意思 你的环境应该设置的是UNICODE编码 
    那么MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    为什么要出错?  宽字节函数 对应宽字节参数? 有什么问题?MessageBoxA(NULL,L"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    当然有问题  你设置的UNICODE编码  那么宽字节函数用UNICODE参数  为什么会没问题(当然也和中文有关)?MessageBoxA(NULL,L"helloworld",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    这个你懂了 我就不说了(当然也和不是中文有关)........
      

  15.   

    建议有两个版本的函数最好不要直接使用函数的原型。例如:
    请使用
    MessageBox
    而不要使用
    MessageBoxA
    或者
    MessageBoxW这样便于程序更改默认的编码
      

  16.   

    MessageBoxA(NULL,"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    // MessageBoxA是 ANSI(MBCS) 函数, "你好,视窗操作系统!"是 ANSI(MBCS)编码,正好匹配,不会乱码MessageBoxA(NULL,L"你好,视窗操作系统!",TEXT("HelloMsg!"),MB_YESNO|MB_ICONWARNING);
    // MessageBoxA是 ANSI(MBCS) 函数, L"你好,视窗操作系统!"是 unicode编码,不匹配,乱码
      

  17.   

    原来默认的是MBCS编码,明白了,谢谢楼上各位