本帖最后由 screen12 于 2012-03-16 14:25:10 编辑

解决方案 »

  1.   

    应用程序的窗口是用RegisterClassW注册的,与能否处理Unicode字符没有绝对必然的联系。
    完全可以让一个看起来Ansi的程序可以处理Unicode字符
    记事本识别文件是否Unicode是用的BOM文件头。
      

  2.   

    哦,对的,窗口用什么注册和窗口过程是两码,窗口是用RegisterClassW注册,但是窗口过程处理Ansi字符,也没什么问题,只是在把这些字符显示在窗口的时候调用适当的Ansi函数就行了。那请问,应用程序(比如记事本),在处理输入的字符的时候,这些字符是按Ansi方式保存和处理的还是按Unicode方式保存和处理的?
      

  3.   

    记事本用的是edit控件,这个两种编码都能识别
      

  4.   

    那是不是说:现在几乎所有的应用程序,比如记事本,写字板,Word,Excel,IE游览器,或者傲游浏览器,都能处理两种编码?我问这个问题是因为:我如果设计一种输入法,是不是只要向应用程序发送Ansi字符就可以了,它自己会识别的。是这样的吗?
      

  5.   

    记事本是按Ansi方式保存还是Unicode保存文件,取决于用户自己的选择(如果原来是Ansi文本,添加了Unicode编码文字,保存时会提示用户)
    edit控件本身内部两种编码如何处理就不太清楚了(是各管各 或者 统一为Unicode)。
      

  6.   

    我的输入法向记事本发送字符串,按我自己的理解是Ansi字符串,比如向记事本发送'A'字符,长为1,发现在记事本可以很好的识别,并显示这个字符A。是不是说现在几乎所有的程序都能处理Ansi和Unicode两种字符集?我的输入法虽然只能发送Ansi消息,但是在这些程序中却不会出错。如果有一种设计不完善的软件,只能处理Unicode字符,那我的输入法工作在它上面就要出错了?是这样的吗?
      

  7.   

    那么post WM_CHAR消息给应用程序的时候,在wParam里填的是Ansi字符还是Unicode字符呢?你知道,《Windows程序设计》中说:如果该窗口是RegisterClassA注册的,那在wParam里就是Ansi字符,如果是RegisterClassW注册的,那wParam里就是Unicode字符。那向应用程序发送这个消息的时候,是发Ansi还是Unicode字符呢?
      

  8.   

    那怎样写呢?发给应用程序的字符串是ansi还是unicode?
      

  9.   

    输入法是什么程序,就要像被输入的窗口输入什么字符,比如你模仿一个输入法的话,如果你用ansi工程输入的是汉字,对方是一个edit,是unicode的还是ansi的我忘了,俺这么试过是正确的。if( ( unsigned char )t >= 0xa0 && ( unsigned char )e >= 0xa0 )
    {
    WPARAM a;
    a = ( unsigned char )e;
    a <<= 8;
    a += ( unsigned char )t;
    // 汉字
    ::SendMessage( hwnd, WM_CHAR, ( WPARAM )a, 0x00000001 );
    i++;
    }
    a是汉字的ansi码而俺的unicode工程是这样的
    ::SendMessage( hwnd, WM_KEYDOWN, ( WPARAM )( t ), 0x001f0001 );
    ::SendMessage( hwnd, WM_CHAR, ( WPARAM )( t ), 0x001f0001 );
    ::SendMessage( hwnd, WM_KEYUP, ( WPARAM )( t ), 0xc01f0001 );
    t是字符的utf16码,中英文通用。
      

  10.   

    感谢!我可能明白了。任何输入法中都有一些窗口,最重要的是一个叫UI窗口,看来,这个窗口如果是RegisterClassA注册的,就得向应用程序发送Ansi字符,否则就发送Unicode字符。
    得由输入法本身来决定是发送什么字符。我终于明白这一点了。输入法中有一个输入上下文,输入上下文是一个数据结构,其中有应用程序窗口句柄。看来是这样的:如果你这个输入法是unicode的,那应用程序的窗口就会是unicode的,如果相反则它也相反。可是又有一个问题来了:假如有一个人,编写了一个应用程序,是纯Ansi的,而输入法则是unicode的,则会发生什么事情?
      

  11.   

    应该没什么问题,我前面说的记不清要输入的窗口是什么窗口了,今天看了一下,是unicode的,我用ansi工程以及unicode工程都操作成功。
    目标工程:unicode 的edit
    输入工程:ansi,输入汉字时发送汉字的gb编码。
    输入工程:unicode,输入汉字时发送汉字的utf16编码。