本帖最后由 yaxiya 于 2012-09-25 11:40:51 编辑

解决方案 »

  1.   

    CP_ACP 就是扩展Asicc编码.
    扩展Asicc编码中, 0-127是固定的, 1个字符表示1个字.128 - 255 表示的含义随编码不同而不同.
    但128-255只有 128个值, 而汉字远远不止128个,
    所以无论哪个汉字编码, 汉字部分肯定至少都是双字节的.中文XP默认字符编码是 GBK(936), 汉字部分是双字节编码.
    1st字节 0x81~0xFE. 2rd字节 0x40~0x7E 和 0x80至0xFE所以你在第一个帖子里面 0x7A 比 0x8A 转出来要多一个字节.
    因为第二个字节不在编码范围内, 转出来是个问号.GB18030(54936)编码汉字部分 分双字节部分和四字节部分.双字节部分
    1st字节 0x81~0xFE. 2rd字节 0x40~0x7E 和 0x80至0xFE四字节部分
    1st字节 0x81~0xFE. 2rd字节 0x30~0x39, 1rd字节 0x81~0xFE. 4th字节 0x30~0x39所以 你要是用 54936 转 0x81, 0x30, 0x81, 0x30 只会转出来1个
      

  2.   

    MultiByteToWideChar(第一个参数设为CP_ACP)为什么会将0xAA,0x01做为一个自己来处理?既然CP_ACP是ASCII,那么0xAA就表示一个字符,0x01也表示一个字符;按道理就应该把0xAA,0x01表示为两个字符来处理,在这里好像作为一个字符来处理了;
      

  3.   

    不管是0x8A还是0xAA都在ASCII字符集中(扩展的ASCII),只不过这两个超出了127;
      

  4.   

    说直白点吧.编码是一种约定,
    ASCII的约定是 0-127 每个字符对应一个字节.计算机到了中国, 自然要表示汉字.
    0-127 已经被占了, 只有用 128-255来,
    但是 128-255 只有128种字, 不足以表示汉字.因此 GBK编码约定, 用2个BYTE来表示一个汉字
    1st BYTE 如果介于 0x81~0xFE, 这就是个汉字.
    与紧跟其后的BYTE共同表示1个汉字.
      

  5.   

    看来我们谈到的问题走叉了;也许是我没有表达清楚;
     unsigned char str[4]={0xAA,0x01,0x38,0};
    其中的0xAA应该在128-255之间吧(只不过是扩展的ASCII字符集)?0x01也在ASCII字符集中吧?
    我的意思就是说:当MultiByteToWideChar为什么要将0xAA与0x01合并起来作为一个字符处理?我的理解就是0xAA既然在扩展ASCII中,0x01也在ASCII中,就应该按照两个字符来处理呀?这就是我所疑惑的问题;
      

  6.   

    说直白点吧.编码是一种约定,
    ASCII的约定是 0-127 每个字符对应一个字节.计算机到了中国, 自然要表示汉字.
    0-127 已经被占了, 只有用 128-255来,
    但是 128-255 只有128种字, 不足以表示汉字.因此 GBK编码约定, 用2个BYTE来表示一个汉字

    1st BYTE 如果介于 0x81~0xFE, 这就是个汉字.
    与紧跟其后的BYTE共同表示1个汉字.
    跟6楼一样的, 标红的地方不一样而已.
    第二个字节不在编码范围内, 转出来是个问号.
    1楼回答里面的一句话
      

  7.   

    咱先撇开汉字不说;咱就说128-255之间的字符,0xAA是170,该字迹就表示一个字符,只不过是扩展的ASCII中的字符,该字符也是欧洲人语言的字符;MultiByteToWideChar为什么不将该OxAA单独处理,而非要与后面对的0x01一起处理;这就是我的疑惑所在;我也知道两个字节用于编码一个汉字;
      

  8.   

    如果我将MultiByteToWideChar第一个参数设置为CP_UTF7,那么就把0xAA,0x01当作两个字符来处理了;这就是我一直不明白的原因?
      

  9.   

    中文XP CP_ACP是用 GBK编码, CP_UTF7 是加密编码.
    这能一样么.
      

  10.   

    我用的windows 2003 server版本
      

  11.   

    好吧 中文Windows CP_ACP是用 GBK编码为啥很多中文软件到英文系统上面都变乱码了, 就是这个原因.CP_ACP随系统语言变化而变化.在中文系统中 0xAA01 表示1个汉字(虽然是个问号)
    在英文系统中 0xAA01 表示2个字符(俩问号)
    在日文系统中 0xAA01 表示其他的字(乱码)之后的VS系统创建的时候默认都是UNICODE编码就是因为
    0x4E01 在中文系统里面是1个汉字, 在英文系统里面也是1个汉字.
    而且是同1个汉字.
      

  12.   

    哦,网络上的资料说CP_ACP是表示ANSI;我还以为是一个字节表示一个字符;
    那MultiByteToWideChar这里要想把OxAA,0xO1分开表示处理成0x00,0xAA,0x00,0x01 MultiByteToWideChar第一个参数应该改成什么?
    我只是随便用CP_UTF7去测试,结果达到了目的,但不知道什么原因?
      

  13.   

    UTF系列编码都是设计为从UNICODE到ascii的编码.UTF7使用7位进行编码, 因此编码后的ascii结果肯定是可见字符(0-127).
    而你给的数字超出了这个范围, 属于非法字符.非法字符如何转码看转码器的发挥了,
    没有必然的规定和解释.你的需求还是手转吧.