我是用vb先写了个组件,然后在.net里面调用,这样最方便!

解决方案 »

  1.   

    嗯Unicode转Ascii的方法就是把高八位砍掉
    所以楼主估计问题就问错了
      

  2.   

    把高八位砍掉?不是的,我用OLLYDBG调试一个VB做的软件,它把UNICODE的"龙"字(编码0x9F99)用rtcAnsiValueBstr转换成了0xC1FA返回.然后再参与其它计算的.所以肯定不是砍掉这么简单...还请再指点...
      

  3.   

    但我再跟踪进它的rtcAnsiValueBstr的时候,看到它调用api:WideCharToMultiByte,引用的页码是ASCII的CP_ACP,如果有人懂ASM的话就最好了,我把rtcAnsiValueBstr的DEASM结果发上来:
    660E657B >/$  55            PUSH    EBP
    660E657C  |.  8BEC          MOV     EBP, ESP
    660E657E  |.  57            PUSH    EDI
    660E657F  |.  8B7D 08       MOV     EDI, [ARG.1]
    660E6582  |.  85FF          TEST    EDI, EDI
    660E6584  |.  75 0D         JNZ     SHORT 660E6593
    660E6586  |.  33C0          XOR     EAX, EAX
    660E6588  |>  85C0          TEST    EAX, EAX
    660E658A  |.  75 0E         JNZ     SHORT 660E659A
    660E658C  |.  6A 05         PUSH    5
    660E658E  |.  E8 2078FEFF   CALL    660CDDB3
    660E6593  |>  8B47 FC       MOV     EAX, [EDI-4]
    660E6596  |.  D1E8          SHR     EAX, 1
    660E6598  |.^ EB EE         JMP     SHORT 660E6588
    660E659A  |>  6A 00         PUSH    0                                   ; /pDefaultCharUsed = NULL
    660E659C  |.  6A 00         PUSH    0                                   ; |pDefaultChar = NULL
    660E659E  |.  8D45 0A       LEA     EAX, [EBP+A]                        ; |
    660E65A1  |.  6A 02         PUSH    2                                   ; |MultiByteCount = 2
    660E65A3  |.  50            PUSH    EAX                                 ; |MultiByteStr
    660E65A4  |.  6A 01         PUSH    1                                   ; |WideCharCount = 1
    660E65A6  |.  57            PUSH    EDI                                 ; |WideCharStr
    660E65A7  |.  6A 00         PUSH    0                                   ; |Options = 0
    660E65A9  |.  6A 00         PUSH    0                                   ; |CodePage = CP_ACP
    660E65AB  |.  FF15 24120066 CALL    [<&KERNEL32.WideCharToMultiByte>]   ; \WideCharToMultiByte
    660E65B1  |.  83F8 02       CMP     EAX, 2
    660E65B4  |.  75 12         JNZ     SHORT 660E65C8
    660E65B6  |.  0FB645 0A     MOVZX   EAX, BYTE PTR [EBP+A]
    660E65BA  |.  0FB64D 0B     MOVZX   ECX, BYTE PTR [EBP+B]
    660E65BE  |.  C1E0 08       SHL     EAX, 8
    660E65C1  |.  03C1          ADD     EAX, ECX
    660E65C3  |>  5F            POP     EDI
    660E65C4  |.  5D            POP     EBP
    660E65C5  |.  C2 0400       RETN    4
    660E65C8  |>  66:0FB645 0A  MOVZX   AX, BYTE PTR [EBP+A]
    660E65CD  \.^ EB F4         JMP     SHORT 660E65C3
      

  4.   

    那是什么码呢?我使用ASCII格式查看时,0xC1FA也是显示"龙"字.
      

  5.   

    帮我用C#试一试你认识的有关函数,看"龙"字什么时候会变成ASCII的"龙"字,好吗?
    因为我今天才开始学C#,昨天才下的VC#2005,很不熟这环境.
      

  6.   

    string str = "龙";
    byte[] bytes = Encoding.Default.GetBytes(str);
    foreach(byte b in bytes)
    {
    Console.Write(b.ToString("X"));
    }// 输出C1FA
    // Encoding.Default就是ANSI编码
      

  7.   

    这个问题是解决了,但有没有某个函数能实现当要转换的字符是字母或者下画线之类时,即UNICODE值都小于128时转换的结果是ANSI,当然,这个问题俺也知可以在之前判断.你不答这个问题俺也会付帐的.
      

  8.   

    // UNICODE值都小于128时转换的结果是ANSI
    这个地方就应该是Ascii了...如果你说的是Utf-8你可以不付帐或者给别人,分对我有啥用?