关于多字节和utf8转码的问题

for_while 2014-07-16 02:35:27
项目里遇到一个问题,从sdk获取过来的字符是多字节的,在程序界面上用utf8编码显示。转换是用MultiByteToWideChar(CP_ACP,....)先转成宽字节,然后在用WideCharToMultiByte(CP_UTF8,...)转成utf8.
之前一直都是处理中英文,没有出现问题。现在碰到了要处理其他语言的情况,比如希伯来文,在调用WideCharToMultiByte后都变成?了。
现在请教大大们,在不知道ansi是哪种语言的前提下,怎么转成utf8编码?
...全文
461 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2014-07-21
  • 打赏
  • 举报
回复
弄一个配置就行了,你在中文系统下可能要显示泰文之类的,cp_acp就固定下来了。
dvlinker 2014-07-20
  • 打赏
  • 举报
回复
调用MultiByteToWideChar,使用CP_ACP本地编码,如果待转换的字符串编码和本地编码一样,则转成Unicode是没问题的 比如你是简体中文的操作系统,那本地编码是GBK,如果待转换的字符串是GBK,或者英文或数字,则转换没问题的;如果待转换的字符串是非GBK编码的,用GBK编码去转,肯定是乱码的 主要原因是,CP_ACP是本地编码,其编码值不是全球统一的。Unicode和Utf8才是全球统一编码,如果要解决多语言的乱码问题,考虑客户端和服务器都支持,那服务器侧及与客户端交互的数据应该使用Utf8编码,客户端显示的时候统一将utf8转成Unicode后显示。因为Utf8是全球统一编码,转换成Unicode肯定没有乱码问题。
dvlinker 2014-07-20
  • 打赏
  • 举报
回复
引用 12 楼 my3439955 的回复:
MultiByteToWideChar(CP_ACP是从本地编码转为宽字节,WideCharToMultiByte(CP_UTF8是从宽字节转为utf8 在简体中文操作系统上,MultiByteToWideChar(CP_ACP就是将gb2312转为宽字节,你传入希伯来文,自然就乱码了。和后半部分到utf8的转换无关
正解~
阿呆_ 2014-07-19
  • 打赏
  • 举报
回复
实际上是有办法判断正确的code page的(不考虑效率的话),比如利用MultiByteToWideChar的一个特性:转wide char时无法转换的字符不会出现在最终wide string里,Vista之前它会被丢弃,Vista及以后Windows会将它替换成一个默认unicode字符,因此我们只要将转换结果(通过GetLastError()看是否ERROR_NO_UNICODE_TRANSLATION可以判断是否一次就转换成功了)用WideCharToMultiByte用相同的code page再转回multibyte string,然后比较转换前后的不同就可以发现原始字串中无法转换的字符,然后用个循环+MB_ERR_INVALID_CHARS 标记尝试不同的codepage调用MultiByteToWideChar专门从这个无法转换的字符开始转,通过调用是否成功就可以知道这个字符究竟是什么code page的并且是否按正确的code page转换成wide string了(可能有误判,但是可能性并不高)-- 其实不用考虑一个multibyte string里出现一个以上的codepage编码的字符(如果真的使用了不同code page保存字符串,那么要么这个codepage里本来就有支持,要么它不会存成普通的multibyte string而是直接存成比如UTF-8了)
encoderlee 版主 2014-07-19
  • 打赏
  • 举报
回复
这个就不好搞了,必须知道是什么地区的语言才行,这正是多字节字符集的缺点,UTF8和Unicode正是为了解决这些问题才产生的。
图灵转世 2014-07-19
  • 打赏
  • 举报
回复
路过,学习一下。我在qt上也发现是乱码,估计也是utf-8的问题。
wistom 2014-07-19
  • 打赏
  • 举报
回复
楼主,这代码写好了吗。我也正在考虑写这个东东。。改来改去只能用全局钩子,本想用线程钩子的。。。。结果显示不
  • 打赏
  • 举报
回复
这里有个代码页的概念,CP_ACP可以换成正确的代码页的值,例如希伯来文是1255(你告诉我的) 常见代码页(我知道的一部分) 936 —简体中文(GBK) 950 —繁体中文 932 —日文 437 —纯英文
  • 打赏
  • 举报
回复
MultiByteToWideChar(CP_ACP是从本地编码转为宽字节,WideCharToMultiByte(CP_UTF8是从宽字节转为utf8 在简体中文操作系统上,MultiByteToWideChar(CP_ACP就是将gb2312转为宽字节,你传入希伯来文,自然就乱码了。和后半部分到utf8的转换无关
阿呆_ 2014-07-17
  • 打赏
  • 举报
回复
可以尝试MultiByteToWideChar(CP_ACP,...)然后WideCharToMultiByte(CP_ACP,...)再比较前后的MBCS,如果不相等那么意味着存在当前字符集以外的字符,然后EnumLanguageGroupLocales尝试每个locale下MultiByteToWideChar, WideCharToMultiByte...
for_while 2014-07-16
  • 打赏
  • 举报
回复
引用 8 楼 wqvbjhc 的回复:
[quote=引用 7 楼 for_while 的回复:] [quote=引用 6 楼 wqvbjhc 的回复:] CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
是的 ,客户可能装的是英文系统。[/quote] 英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。 自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page[/quote] 并且这种方法有个最大的问题,如果多种语言混用怎么办?
for_while 2014-07-16
  • 打赏
  • 举报
回复
引用 8 楼 wqvbjhc 的回复:
[quote=引用 7 楼 for_while 的回复:] [quote=引用 6 楼 wqvbjhc 的回复:] CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
是的 ,客户可能装的是英文系统。[/quote] 英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。 自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page[/quote] 怎么检测?让用户自己设置,还是程序里有办法检测?
wqvbjhc 2014-07-16
  • 打赏
  • 举报
回复
引用 7 楼 for_while 的回复:
[quote=引用 6 楼 wqvbjhc 的回复:] CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
是的 ,客户可能装的是英文系统。[/quote] 英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。 自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page
for_while 2014-07-16
  • 打赏
  • 举报
回复
引用 6 楼 wqvbjhc 的回复:
CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
是的 ,客户可能装的是英文系统。
wqvbjhc 2014-07-16
  • 打赏
  • 举报
回复
CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
for_while 2014-07-16
  • 打赏
  • 举报
回复
我上面说过,无法实现知道待转换的语言是哪个,1255这种方式明显不能通用。。
mayudong1 2014-07-16
  • 打赏
  • 举报
回复
MultiByteToWideChar(1255,...) 我觉得改成这样就可以了
for_while 2014-07-16
  • 打赏
  • 举报
回复
系统是支持希伯来文的,用谷歌翻译的希伯来文复制过来,程序里界面上都能正常显示的
信阳毛尖 2014-07-16
  • 打赏
  • 举报
回复
引用 1 楼 for_while 的回复:
追加一点:现在是碰到客户用希伯来文,导致乱码了。我查了一下,如果MultiByteToWideChar(1255,...)这样转换就不会有问题。但是客户使用的语言可能有很多种,无法提前预知
你的系统支持希伯来文吗?
for_while 2014-07-16
  • 打赏
  • 举报
回复
追加一点:现在是碰到客户用希伯来文,导致乱码了。我查了一下,如果MultiByteToWideChar(1255,...)这样转换就不会有问题。但是客户使用的语言可能有很多种,无法提前预知

16,472

社区成员

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

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

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