追加一点:现在是碰到客户用希伯来文,导致乱码了。我查了一下,如果MultiByteToWideChar(1255,...)这样转换就不会有问题。但是客户使用的语言可能有很多种,无法提前预知

解决方案 »

  1.   

    MultiByteToWideChar(1255,...)
    我觉得改成这样就可以了
      

  2.   

    CP_ACP代表客户表的code page, 客户的code page一定不是希伯来文才会导致转换出错。
      

  3.   

    是的 ,客户可能装的是英文系统。
    英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。
    自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page
      

  4.   

    是的 ,客户可能装的是英文系统。
    英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。
    自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page
    怎么检测?让用户自己设置,还是程序里有办法检测?
      

  5.   

    是的 ,客户可能装的是英文系统。
    英文系统中调用MultiByteToWideChar把其他code page转为wide char只有硬性指定,如1255希伯来文。没其他办法。
    自己做个表映射,检测需要什么语言转为widechar,就有该语言的code page
    并且这种方法有个最大的问题,如果多种语言混用怎么办?
      

  6.   

    可以尝试MultiByteToWideChar(CP_ACP,...)然后WideCharToMultiByte(CP_ACP,...)再比较前后的MBCS,如果不相等那么意味着存在当前字符集以外的字符,然后EnumLanguageGroupLocales尝试每个locale下MultiByteToWideChar, WideCharToMultiByte...
      

  7.   

    MultiByteToWideChar(CP_ACP是从本地编码转为宽字节,WideCharToMultiByte(CP_UTF8是从宽字节转为utf8在简体中文操作系统上,MultiByteToWideChar(CP_ACP就是将gb2312转为宽字节,你传入希伯来文,自然就乱码了。和后半部分到utf8的转换无关
      

  8.   

    这里有个代码页的概念,CP_ACP可以换成正确的代码页的值,例如希伯来文是1255(你告诉我的)常见代码页(我知道的一部分)
    936 —简体中文(GBK)
    950 —繁体中文
    932 —日文
    437 —纯英文
      

  9.   

    路过,学习一下。我在qt上也发现是乱码,估计也是utf-8的问题。
      

  10.   

    这个就不好搞了,必须知道是什么地区的语言才行,这正是多字节字符集的缺点,UTF8和Unicode正是为了解决这些问题才产生的。
      

  11.   

    实际上是有办法判断正确的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了)
      

  12.   

    调用MultiByteToWideChar,使用CP_ACP本地编码,如果待转换的字符串编码和本地编码一样,则转成Unicode是没问题的
    比如你是简体中文的操作系统,那本地编码是GBK,如果待转换的字符串是GBK,或者英文或数字,则转换没问题的;如果待转换的字符串是非GBK编码的,用GBK编码去转,肯定是乱码的主要原因是,CP_ACP是本地编码,其编码值不是全球统一的。Unicode和Utf8才是全球统一编码,如果要解决多语言的乱码问题,考虑客户端和服务器都支持,那服务器侧及与客户端交互的数据应该使用Utf8编码,客户端显示的时候统一将utf8转成Unicode后显示。因为Utf8是全球统一编码,转换成Unicode肯定没有乱码问题。
      

  13.   

    弄一个配置就行了,你在中文系统下可能要显示泰文之类的,cp_acp就固定下来了。