WideCharToMultiByte函数的执行是否和操作系统的语言有关

凌乱哥 2016-12-26 06:22:10
要转换的字符串是日语的:“連絡先\連絡先_1.xls

2行代码说明问题:

int nLength = wcslen(fn);//fn是wchar_t*类型
int nBytes = WideCharToMultiByte(0, 0, fn, -1, NULL, 0, NULL, NULL);

在Win10中文版系统上,nBytes比nLength多出7
在Win8英文版系统上,nBytes比nLength只多出1

是系统语言问题还是函数用法问题?
...全文
338 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-29
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
soundbird 2016-12-27
  • 打赏
  • 举报
回复
第一个参数标示要转成编码格式,0就是CP_ACP,标示转成ANSI,这种编码一个中国字用两个字节储存。看你的源字符串是UTF-16,就是Unicode,可以很好理解,源字符串中有中文,所以转成ANSI会多六七个长度。在英文操作系统中,系统不识别中文,所有字符仅仅当做普通英文字符处理,所以返回长度只会多一个长度。实际上,在字符串编码转换中,最好是UFT16和UFT8之间转换,即第一个参数最好为CP_UTF8
凌乱哥 2016-12-27
  • 打赏
  • 举报
回复
引用 12 楼 zgl7903 的回复:
[quote=引用 2 楼 dingxz105090 的回复:] [quote=引用 1 楼 akirya 的回复:] 第一个参数为啥要填0?
因为我试过了日语的CodePage 932,执行后nBytes比nLength多出7是没错,但是文本不对了,如下: 转换后: [/quote] 比较转换后的HEX值, 应该是非UNICODE字符的代码页不同导致的[/quote] 对,没错,我把转换前的文本复制到Word文档,再选择日语编码保存为纯文本,再用Notepad打开就是后面那个了
凌乱哥 2016-12-27
  • 打赏
  • 举报
回复
引用 10 楼 zzz3265 的回复:
第一个参数用0是用的当前线程的代码页, 自己指定就好了, 试过了日语的CodePage 932,执行后nBytes比nLength多出7是没错,但是文本不对了 这个是因为你显示的字体不对, 你用日文字体就好了
这是在调试时候VS给的文本,这个时候的文本乱码和字体没有关系吧 我记得我之前出现过“调试的文本是对的,输出到界面却是乱码”,这才是和字体有关。
zgl7903 2016-12-27
  • 打赏
  • 举报
回复
引用 2 楼 dingxz105090 的回复:
[quote=引用 1 楼 akirya 的回复:] 第一个参数为啥要填0?
因为我试过了日语的CodePage 932,执行后nBytes比nLength多出7是没错,但是文本不对了,如下: 转换后: [/quote] 比较转换后的HEX值, 应该是非UNICODE字符的代码页不同导致的
oyljerry 2016-12-26
  • 打赏
  • 举报
回复
引用 5楼我是你的主体 的回复:
[quote=引用 4 楼 oyljerry 的回复:] 日文的话,你需要本地系统支持日文,比如日文操作系统,中文操作系统等有对应的日文字符集,这样你才可以用unicode等进行转换处理
就是说跟计算机的语言、系统环境有关了吧[/quote]对,不然没法知道怎么解码,编码处理
Yofoo 2016-12-26
  • 打赏
  • 举报
回复
第一个参数用0是用的当前线程的代码页, 自己指定就好了, 试过了日语的CodePage 932,执行后nBytes比nLength多出7是没错,但是文本不对了 这个是因为你显示的字体不对, 你用日文字体就好了
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
引用 7 楼 hdt 的回复:
我记得有个api可以设置当前线程的区域
不过我觉得就算是调用了setlocale( LC_ALL, "Japanese" ); 本地还是要有对应的字库才行吧
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
引用 7 楼 hdt 的回复:
我记得有个api可以设置当前线程的区域
setlocale( LC_ALL, "chs" ); 这个吗
真相重于对错 2016-12-26
  • 打赏
  • 举报
回复
我记得有个api可以设置当前线程的区域
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
另外,我在一篇文章中看到: 三、MultiByteToWideChar()函数乱码的问题 有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码! 即使更改MultiByteToWideChar()参数也依然如此。不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况。 由于标准的SDK默认语言为英文,所以肯定会出现这个问题。而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文"。系统定制时选择默认语言的位置于: Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可。
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
引用 4 楼 oyljerry 的回复:
日文的话,你需要本地系统支持日文,比如日文操作系统,中文操作系统等有对应的日文字符集,这样你才可以用unicode等进行转换处理
就是说跟计算机的语言、系统环境有关了吧
oyljerry 2016-12-26
  • 打赏
  • 举报
回复
日文的话,你需要本地系统支持日文,比如日文操作系统,中文操作系统等有对应的日文字符集,这样你才可以用unicode等进行转换处理
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
第一个参数为啥要填0?
用0的话,目前发现英文版系统不正常,中文系统是好的 用932的话,中文系统都不对了
凌乱哥 2016-12-26
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
第一个参数为啥要填0?

因为我试过了日语的CodePage 932,执行后nBytes比nLength多出7是没错,但是文本不对了,如下:

转换后:
  • 打赏
  • 举报
回复
第一个参数为啥要填0?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧