wstring 与 string 的转换

本文介绍如何在C++中实现wchar_t和char之间的相互转换,包括从wchar_t数组到string、从wstring到string、从char数组到wstring等操作,并提供详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wstring 与 string 的转换

wchar*、wstring 和 char*、std::string 的相互转换

字符串是基本内容,必须要掌握。

string实质上是char字符的字符串。

1typedef basic_string<char, char_traits<char>, allocator<char> >
2      string;

wstring实质上是wchar_t字符的字符串,即即所谓的宽字符。

1typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >
2      wstring;

同类型字符相互转换

string字符串和char字符数组可以直接相互转换。

1// char* -> string
2char ch[] = "风中飞舞";
3string str1(ch);
4// string -> const char*
5const char* pch = str1.c_str();

如果想转换到非常量形式char*,可以用strcpy()拷贝到新串,或用const_cast<>运算去掉常量性。

同理,wstring 和 wchar_t数组的转换图上面相同,只不过拷贝串要用wstrcpy()函数。

不同类型字符相互转换

char到wchar_t的转换有好几种,标准C++用流函数os.widen()和os.narrow()可以转换单个字符。

下面用Windows API实现unicode(一般情况下wchar_t使用的编码)和ansi(char使用的编码)的相互转换:

1#include <windows.h>
2include <string>
3 
4// wchar_t* -> string
5std::string wchar2string( const wchar_t* pwchar )
6{
7    int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -1, NULL, 0, NULL, NULL);
8    if (nLen<= 0) return std::string("");
9    char* pszDst = new char[nLen];
10    if (NULL == pszDst) return std::string("");
11    WideCharToMultiByte(CP_ACP, 0, pwchar, -1, pszDst, nLen, NULL, NULL);
12    pszDst[nLen -1] = 0;
13    std::string strTemp(pszDst);
14    delete [] pszDst;
15    return strTemp;
16}
17 
18// wstring -> string
19std::string wstring2string( const std::wstring & wstr )
20{
21    return wchar2string(wstr.c_str());
22}
23 
24// char* -> wstring
25std::wstring char2wstring( const char* pchar , int nLen)
26{
27    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);
28    if(nSize <= 0) return NULL;
29    WCHAR *pwszDst = new WCHAR[nSize+1];
30    if( NULL == pwszDst) return NULL;
31    MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize);
32    pwszDst[nSize] = 0;
33    if( pwszDst[0] == 0xFEFF) // skip Oxfeff
34        for(int i = 0; i < nSize; i ++)
35            pwszDst[i] = pwszDst[i+1];
36    std::wstring wcharString(pwszDst);
37    delete pwszDst;
38    return wcharString;
39}
40 
41// string -> wstring
42std::wstring string2wstring( const std::string & str )
43{
44    return char2wstring(str.c_str(), str.size());
45}
46 
47// char* -> wchar*
48wchar_t* char2wchar( const char* pchar , int nLen)
49{
50    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);
51    if(nSize <= 0) return NULL;
52    WCHAR *pwszDst = new WCHAR[nSize+1];
53    if( NULL == pwszDst) return NULL;
54    MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize);
55    pwszDst[nSize] = 0;
56    return pwszDst;
57}
58// wchar* -> char*
59char* StringManager::wchar2char( const wchar_t* pwchar )
60{
61    int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -1, NULL, 0, NULL, NULL);
62    if (nLen<= 0) return 0;
63    char* pszDst = new char[nLen];
64    if (NULL == pszDst) return 0;
65    WideCharToMultiByte(CP_ACP, 0, pwchar, -1, pszDst, nLen, NULL, NULL);
66    pszDst[nLen -1] = 0;
67    return pszDst;
68}

以上的代码中有重复,应该进一步修改。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值