zoukankan      html  css  js  c++  java
  • UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案

    UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家分享。

    先总结一下网上找到的三种转换的方法:

    方法一:使用函数setlocale

        setlocale(LC_ALL,"chs");

        需要包含头文件#include <locale.h>

        此方法的思路是配置地域化信息。通常在需要输入输出中文的时候设置一下,就没问题了,setlocale详情 点我

    方法二:使用函数:T2A、W2A

                 CString str = _T("D://校内项目//QQ.bmp");

                  //声明标识符
                 USES_CONVERSION;

                 //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
                 char * pFileName = T2A(str);   
                 //char * pFileName = W2A(str); //也可实现转换

                注意:有时候可能还需要添加引用#include   <afxpriv.h>

        使用此方法要注意声明标识符,T2A、W2A详情 点我

    方法三:使用API:WideCharToMultiByte进行转换

                  CString str = _T("D://校内项目//QQ.bmp");

                //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
                  int n = str.GetLength();     // n = 14, len = 18

                 //获取宽字节字符的大小,大小是按字节计算的
                 int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

                 //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
                char * pFileName = new char[len+1];   //以字节为单位

                //宽字节编码转换成多字节编码
                WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

                WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1 ,NULL,NULL);

                 pFileName[len+1] = '/0';   //多字节字符以'/0'结束

          //多谢楼下的提醒,特此修改一下     

          pFileName[len] = '\0';   //多字节字符以'\0'结束

     这三种方法都是感觉比较靠谱的,也有很多人验证了可以成功,但是在我用的时候很悲催,三种方法都不行,经过仔细的考虑,发现第三种方法应该是万无一失,最保险的方法啊,后来经过仔细查找,原来是参数出了问题,黄色被我划掉的是网上流传的比较广泛的方法,WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1 ,NULL,NULL);是我验证成功的写法,至于为什么是这样,留给大家自己思考。WideCharToMultiByte详情 点我

    小弟才疏学浅,写的不对,敬请指正!

  • 相关阅读:
    WCF配置文件注释
    WCF 契约
    等待窗口 or splash 窗体用法
    SOA架构概述
    在高负载网站性能优化
    WCF应用实例
    SOA快速指南 1 2 3,第 3 部分: 服务实现及架构设计
    WCF Binding
    已经添加了对EXCEL的引用,但在出现Microsoft.Office.Interop.Excel.Application没有定义
    Oracle 11g 转换内部编码
  • 原文地址:https://www.cnblogs.com/junyuz/p/2151857.html
Copyright © 2011-2022 走看看