目录

第1章说明    1

1.1 代码    1

1.2 使用    4

第1章说明

VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量。

1.1 代码

函数声明如下:

std::string stringA2W(const char* pA,int nA,UINT uCodePage = CP_ACP);

std::string stringW2A(const wchar_t*pW,int nW,UINT uCodePage = CP_ACP);

std::string stringA2W(const std::string&sA,UINT uCodePage = CP_ACP);

std::string stringW2A(const std::string&sW,UINT uCodePage = CP_ACP);

函数实现如下:

/***************************************************************\

窄字符串 ==> 宽字符串(UTF16LE)

pA [in] 窄字符串首地址

nA [in] 窄字符串长度。小于零就使用 strlen 计算长度。

uCodePage [in] 窄字符串的代码页

如:CP_ACP 表示系统默认;936 表示 GBK……

返回:

宽字符串 sW

宽字符串的字符数 nChar = sW.length() / sizeof(wchar_t)

宽字符串的字节数 nByte = (nChar + 1) * sizeof(wchar_t) - 1

字节数多加了 sizeof(wchar_t) - 1 = 1 个 \0,是为了下面的用法

const wchar_t* pW = (const wchar_t*)sW.c_str();

\***************************************************************/

std::string stringA2W(const char*pA,int nA,UINT uCodePage)

{

std::string sW;

if(pA)

{

if(nA < 0)

{

nA = strlen(pA);

}

if(nA > 0)

{

int nW = MultiByteToWideChar(uCodePage,0,pA,nA,NULL,0);

if(nW > 0)

{

int nByte = (nW + 1) * sizeof(wchar_t);

wchar_t*pW = (wchar_t*)malloc(nByte);

if(pW)

{

MultiByteToWideChar(uCodePage,0,pA,nA,pW,nW);

pW[nW] = L'\0';

sW.assign((const char*)pW,nByte - 1);

free(pW);

}

}

}

}

if(sW.empty())

{

sW = std::string(sizeof(wchar_t) - 1,'\0');

}

return sW;

}

/***************************************************************\

窄字符串 ==> 宽字符串(UTF16LE)

sA [in] 窄字符串

uCodePage [in] 窄字符串的代码页

如:CP_ACP 表示系统默认;936 表示 GBK……

返回:宽字符串

\***************************************************************/

std::string stringA2W(const std::string&sA,UINT uCodePage)

{

return stringA2W(sA.c_str(),sA.length(),uCodePage);

}

/***************************************************************\

宽字符串(UTF16LE) ==> 窄字符串

pW [in] 宽字符串首地址

nW [in] 宽字符串字符数。小于零就使用 wcslen 计算长度。

uCodePage [in] 窄字符串的代码页

如:CP_ACP 表示系统默认;936 表示 GBK……

返回:窄字符串

\***************************************************************/

std::string stringW2A(const wchar_t*pW,int nW,UINT uCodePage)

{

std::string sA;

if(pW)

{

if(nW < 0)

{

nW = wcslen(pW);

}

if(nW > 0)

{

int nA = WideCharToMultiByte(uCodePage,0,pW,nW

,NULL,NULL,NULL,NULL);

if(nA > 0)

{

char*pA = (char*)malloc(nA);

if(pA)

{

WideCharToMultiByte(uCodePage,0,pW,nW

,pA,nA,NULL,NULL);

sA.assign(pA,nA);

free(pA);

}

}

}

}

return sA;

}

/***************************************************************\

宽字符串(UTF16LE) ==> 窄字符串

sW [in] 宽字符串,编码为 UTF16LE

uCodePage [in] 窄字符串的代码页

如:CP_ACP 表示系统默认;936 表示 GBK……

返回:窄字符串

\***************************************************************/

std::string stringW2A(const std::string&sW,UINT uCodePage)

{

return stringW2A((const wchar_t*)sW.c_str()

,sW.length() / sizeof(wchar_t),uCodePage);

}

1.2 使用

有了上述四个函数,字符串的编码转换用一、两行代码即可实现。

如:将GBK字符串"测试"转换为宽字符串

std::string sW = stringA2W("测试");

//简体中文 Windows 下

std::string sW = stringA2W("测试",936);

//安装有代码页936的Windows

如:将GBK字符串"测试"转换为UTF-8编码

std::string sUTF8 = stringW2A(stringA2W("测试",936),CP_UTF8);

如:将GBK字符串"测试"转换为Big5编码

std::string sBig5 = stringW2A(stringA2W("测试",936),950);

VC++ 中使用 std::string 转换字符串编码的更多相关文章

  1. 基于std::string的字符串处理

    转自:http://zxdflyer.blog.163.com/blog/static/25664262201322510217495/ C++标准模板库std使用广泛.该库中处理字符串的对象为std ...

  2. C# 中怎么将string转换成int型

    int intA = 0;1.intA =int.Parse(str);2.int.TryParse(str, out intA);3.intA = Convert.ToInt32(str);以上都可 ...

  3. VC++中 wstring和string的互相转换实现

    在VC++开发中,经常会用到string和wstring,这就需要二者之间的转换,项目中封装了wstring和string相互转换的2个函数,实现如下: //将wstring转换成string std ...

  4. Python3中转换字符串编码

    在使用subprocess调用Windows命令时,遇到了字符串不显示中文的问题,源码如下:#-*-coding:utf-8-*-__author__ = '$USER' #-*-coding:utf ...

  5. 在Linux下使用iconv转换字符串编码

    在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库. iconv函数库有以下三个函数 123456 #include <iconv.h>icon ...

  6. C++ std::string 在一个字符串前插入一个字符串几种方式

    目录 1.直接使用字符串相加 2.使用insert函数 比较:通过Quick C++ Benchmarks 可得到结果 1.直接使用字符串相加 std::string a = "hello& ...

  7. java获取字符串编码和转换字符串编码

    public class EncodingUtil { // 这里可以提供更多地编码格式,另外由于部分编码格式是一致的所以会返回 第一个匹配的编码格式 GBK 和 GB2312 public stat ...

  8. (二)javascript中int和string转换

    在javascript里怎么样才能把int型转换成string型 (1)var x=100 a = x.toString() (2)var x=100; a = x +""; // ...

  9. 在java中,将String类型字符串s赋值为null后,将字符串与其他字符串拼接后得到结果出现了null字符串与其他字符连接的样式

    String s = null; s  += "hello"; System.out.println(s); 结果为:nullhello 原因: 先应用String.valueOf ...

随机推荐

  1. Android开发之Theme、Style探索及源码浅析

    1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...

  2. shell中awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  3. web错误

    “/Web”应用程序中的服务器错误. 服务器 'LD-PC' 上的 MSDTC 不可用. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误 ...

  4. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  5. C#实现随机抽奖和冒泡排序

    随机抽奖程序 string[] s = new string[] { "A", "B", "C", "D", " ...

  6. null&this&super&向上转型

    向上转型:父类声明子类实例化对象 例如A是父类 B是子类    1 : 实际上是父类的对象但将会丢失子类没有的父类方法 ,如果调用方法 将会调用子类重写的父类方法    2:上转型对象不能调用子类新增 ...

  7. CoreData 与 SQLite 比较

    CoreData.framework : iOS中提供了对原始SQLite数据库API访问的封装,通过这个framework来管理数据缓存和持久数据要比使用SQL语句操作SQLite数据库简单和方便许 ...

  8. CUBRID学习笔记 38 net调用java的函数过程

    首先要设置java_stored_procedure 为yes  该配置项在cubrid.conf中 书写并编译java代码 public class SpCubrid{      public st ...

  9. 使用httpclient时候,出现“Too many open files”问题

    最近接触的sendHttpPostRequest的问题比较多,近期碰到了关于 "java.net.SocketException: Too many open files" 的问题 ...

  10. 第一发。。。codeforces 609 C Load Balancing 贪心

    /*题意:给你一个序列经过最小变换,变换一次为一个数+1,一个数-1,使得最大值与最小值相差1:思路:与最后得到的序列相差的sum/2:*/#include<iostream> #incl ...