免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 光速
打印 上一主题 下一主题

[C] MultiByteToWideChar()函数返回值不同? [复制链接]

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
11 [报告]
发表于 2012-09-21 11:38 |只看该作者
linux_c_py_php 发表于 2012-09-21 11:27
0XAA一定不是ASCII, 你....

我只能汗了...

我现在定义了 unsigned char str[4]={0xAA,0x01,0x38,0};
这个字符数组中的每个字节不能代表一个字符?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
12 [报告]
发表于 2012-09-21 11:41 |只看该作者
本帖最后由 linux_c_py_php 于 2012-09-21 14:12 编辑

如果你说这是UNICODE的字节流, 可以符合. (假设这就是UNICODE的字节流, 看不出来这是大端还是小端存储的)

如果你说这是GBK的字节流, 没人信.

如果你说这是UTF8的字节流, 没人信.



光速 发表于 2012-09-21 11:38
我现在定义了 unsigned char str[4]={0xAA,0x01,0x38,0};
这个字符数组中的每个字节不能代表一个字符?
...

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
13 [报告]
发表于 2012-09-21 11:43 |只看该作者
我就想弄明白返回值怎么就不同,0xAA就是十进制的170,他也表示一个字符,这就是我的疑问所在;

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
14 [报告]
发表于 2012-09-21 13:59 |只看该作者
本帖最后由 linux_c_py_php 于 2012-09-21 14:13 编辑

因为你给的字节流不是有效的UNICODE编码字节流, 大小端你都不确定, 而且你自己都不知道这是什么编码的字节流, 从表面看像是UNICODE的字节流, 大小端没法判断. 但我iconv分别尝试了utf-16-big, utf-16-little, 都是无效的.

没见过不知道编码就想转编码的, 很可笑了.

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
15 [报告]
发表于 2012-09-21 14:48 |只看该作者
linux_c_py_php 发表于 2012-09-21 13:59
因为你给的字节流不是有效的UNICODE编码字节流, 大小端你都不确定, 而且你自己都不知道这是什么编码的字节流 ...


不晓得你看清楚我提的问题没有:
  unsigned char str[4]={0xAA,0x01,0x38,0};
  unsigned char str[4]={0x7A,0x01,0x38,0};
  len=MultiByteToWideChar(CP_ACP,0,str,-1,0,0);
上面两个字符数组为什么通过MultiByteToWideChar()返回的值不一样,你就说为什么不一样?我采用VC6工具;

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
16 [报告]
发表于 2012-09-21 15:17 |只看该作者
光速 发表于 2012-09-21 14:48
不晓得你看清楚我提的问题没有:
  unsigned char str[4]={0xAA,0x01,0x38,0};
  unsigned char str[4 ...


CP_ACP 改成 437,应该就是你要的效果了。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
17 [报告]
发表于 2012-09-21 15:21 |只看该作者
我没用过windows的, 只用过iconv.

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
18 [报告]
发表于 2012-09-21 15:36 |只看该作者
hellioncu 发表于 2012-09-21 15:17
CP_ACP 改成 437,应该就是你要的效果了。

嗯!正确
不过MultiByteToWideChar第一个参数改成437,这其中原因是什么?希望能给予解释,谢谢!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
19 [报告]
发表于 2012-09-21 15:48 |只看该作者
光速 发表于 2012-09-21 15:36
嗯!正确
不过MultiByteToWideChar第一个参数改成437,这其中原因是什么?希望能给予解释,谢谢!


看MSDN呀

437 对应的是 OEM United States
CP_ACP: The current system Windows ANSI code page ,应该是936(你看GetACP()的返回值),而936对应的是 ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312),你那 0xAA,0x01 被当作是一个汉字了

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
20 [报告]
发表于 2012-09-21 16:27 |只看该作者
回复 19# hellioncu

  1. #include <windows.h>
  2. #include <stdio.h>

  3. int main(int argc,char *argv[])
  4. {
  5.         DWORD len;
  6.     unsigned char str[4]={0xAA,0x01,0x38,0};
  7.         wchar_t * strPtr;
  8.         len=MultiByteToWideChar(437,0,str,-1,0,0);
  9.         strPtr=SysAllocStringLen(0,len);
  10.         MultiByteToWideChar(437,0,str,-1,strPtr,len);
  11.         ;
  12. }
复制代码
上面代码将str[4]转换UNICODE编码;结果发现0xAA转化为0x00  0xAC,本来想转为为0x00 0xAA;
这又是哪里出现问题?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP