wstring和string的转化

本文介绍了如何在C++中实现std::string与std::wstring之间的高效转换方法。提供了两种不同的实现方式,一种是简单的字符复制,另一种则使用了Windows API进行多字节到宽字符的转换,后者能够更好地处理包含多字节字符的字符串。

std::wstring StringToWString(const std::string& s)
{
 std::wstring temp(s.length(),L' ');
 std::copy(s.begin(), s.end(), temp.begin());
 return temp;
}
std::string WStringToString(const std::wstring& s)
{
 std::string temp(s.length(), ' ');
 std::copy(s.begin(), s.end(), temp.begin());
 return temp;
}

 

///////////////////////////////////////////////////////////////////////
std::wstring CSOAP::StringToWString(const std::string& s)
{
 //std::wstring temp(s.length(),L' ');
 //std::copy(s.begin(), s.end(), temp.begin());
 //return temp;
 int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)s.c_str(), s.length(), 0, 0);
 if(nSize <= 0) return NULL;
 WCHAR *pwszDst = new WCHAR[nSize+1];
 if( NULL == pwszDst) return NULL;
 MultiByteToWideChar(CP_ACP, 0,(LPCSTR)s.c_str(), s.length(), pwszDst, nSize);
 pwszDst[nSize] = 0;
 if( pwszDst[0] == 0xFEFF) // skip Oxfeff
  for(int i = 0; i < nSize; i ++)
   pwszDst[i] = pwszDst[i+1];
 wstring wcharString(pwszDst);
 delete pwszDst;
 return wcharString;


}
std::string CSOAP::WStringToString(const std::wstring& s)
{
 //std::string temp(s.length(), ' ');
 //std::copy(s.begin(), s.end(), temp.begin());
 //return temp;
 int nLen = WideCharToMultiByte(CP_ACP, 0, s.c_str(), -1, NULL, 0, NULL, NULL);
 if (nLen<= 0) return std::string("");
 char* pszDst = new char[nLen];
 if (NULL == pszDst) return std::string("");
 WideCharToMultiByte(CP_ACP, 0, s.c_str(), -1, pszDst, nLen, NULL, NULL);
 pszDst[nLen -1] = 0;
 std::string strTemp(pszDst);
 delete [] pszDst;
 return strTemp;


}

转载于:https://www.cnblogs.com/zzili/archive/2012/12/06/6663343.html

<think>好的,用户想了解如何将wstring换为string。首先,我需要回忆一下C++中处理字符串换的相关知识。wstring是宽字符字符串,通常用于Unicode,而string是窄字符字符串。换时需要注意编码问题,否则可能会有乱码。 首先,应该考虑使用标准库中的localecodecvt方法。比如使用wstring_convert搭配codecvt_utf8或codecvt_byname。不过,codecvt在C++17中被弃用了,所以用户可能需要考虑替代方案,比如使用第三方库如ICU或者系统特定的函数。 然后,用户可能需要跨平台的支持,比如WindowsLinux。在Windows上,WideCharToMultiByte是一个常用的API,而在Linux上,可能需要使用iconv或者std库的方法。需要提醒用户注意编码的一致性,比如UTF-8或者本地代码页。 另外,需要检查换过程中是否有字符无法换的情况,这时候应该处理错误,比如跳过或者替换。比如在wstring_convert中,可以设置错误处理的策略。 可能用户的实际应用场景是什么?如果他们处理的是多语言文本,特别是非ASCII字符,正确选择编码至关重要。比如在中文环境下,可能需要使用GBK或者UTF-8编码,否则换后的string会显示乱码。 还需要提供示例代码,展示不同的换方法,并说明每种方法的优缺点。比如使用标准库的方法虽然简单,但可能受限于编译器支持;而使用Windows API则更可靠但缺乏跨平台性。 最后,提醒用户注意内存管理异常处理,确保换后的string正确释放资源,避免内存泄漏。同时,测试不同情况下的换结果,确保没有数据丢失或损坏。</think>在C++中将`wstring`(宽字符串)换为`string`(窄字符串)需要处理字符编码的换。以下是逐步实现方法: --- ### **1. 理解基本概念** - `wstring`:基于`wchar_t`的字符串,通常用于Unicode(如UTF-16或UTF-32)。 - `string`:基于`char`的字符串,通常使用本地编码(如UTF-8、GBK等)。 --- ### **2. 标准库方法(C++11,已弃用但常用)** 使用`<locale>``<codecvt>`头文件中的工具(注意:C++17弃用了`codecvt`,但仍可暂时使用): ```cpp #include <string> #include <locale> #include <codecvt> std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; std::string narrow_str = converter.to_bytes(wide_str); // 示例 std::wstring wide_str = L"你好,世界!"; std::string narrow_str = converter.to_bytes(wide_str); // UTF-8编码 ``` --- ### **3. 跨平台方法(推荐)** #### **Windows API** 使用`WideCharToMultiByte`处理UTF-8或本地编码: ```cpp #include <Windows.h> std::string WStringToString(const std::wstring& wstr) { int size_needed = WideCharToMultiByte( CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), nullptr, 0, nullptr, nullptr ); std::string str(size_needed, 0); WideCharToMultiByte( CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), &str[0], size_needed, nullptr, nullptr ); return str; } ``` #### **Linux/macOS** 使用`iconv`库或标准库: ```cpp #include <string> #include <cwchar> std::string WStringToString(const std::wstring& wstr) { std::string str(wstr.length() * 4, 0); // 预留足够空间 std::wcstombs(&str[0], wstr.c_str(), str.size()); return str.c_str(); // 实际长度可能更短 } ``` --- ### **4. 第三方库(推荐用于生产环境)** - **ICU库**:支持完整的Unicode换。 - **Boost.Locale**:提供跨平台的编码换。 --- ### **5. 注意事项** 1. **编码一致性**:确保源`wstring`目标编码(如UTF-8、GBK)匹配。 2. **错误处理**:无法换的字符可能导致数据丢失,需设置错误处理策略。 3. **性能**:频繁换时建议预分配缓冲区。 --- ### **示例完整代码** ```cpp #include <iostream> #include <string> #include <locale> #include <codecvt> int main() { std::wstring wide_str = L"Hello, 世界!"; // 方法1:使用wstring_convert(C++11) std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; std::string narrow_str = converter.to_bytes(wide_str); std::cout << "Converted: " << narrow_str << std::endl; return 0; } ``` --- ### **总结** - **简单场景**:使用`std::wstring_convert`(需注意C++17弃用问题)。 - **生产环境**:推荐ICU或Boost.Locale。 - **Windows专用**:直接调用`WideCharToMultiByte`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值