std::string CString 之间的转换
时间: 2025-05-18 14:12:01 浏览: 11
### 关于 `std::string` 和 `CString` 的互相转换
#### 1. **从 `std::string` 转换到 `CString`**
在 MFC 中,如果项目是以 Unicode 编译的,则需要将 `std::string` 转换成宽字符形式 (`wchar_t`) 后再赋值给 `CString`。以下是实现方法:
```cpp
CString StdStringToCString(const std::string& strSource) {
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &strSource[0], (int)strSource.size(), nullptr, 0);
std::wstring result(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &strSource[0], (int)strSource.size(), &result[0], size_needed);
return CString(result.c_str());
}
```
上述代码通过 `MultiByteToWideChar` 函数将 UTF-8 字符串转换成宽字节字符串,并将其存储在一个临时的 `std::wstring` 对象中[^1]。
---
#### 2. **从 `CString` 转换到 `std::string`**
对于从 `CString` 到 `std::string` 的转换,可以采用以下方式完成:
```cpp
std::string CStringToStdString(const CString& cStr) {
int sizeNeeded = ::WideCharToMultiByte(CP_UTF8, 0, cStr.GetString(), cStr.GetLength(), NULL, 0, NULL, NULL);
std::string utf8Str(sizeNeeded, '\0');
::WideCharToMultiByte(CP_UTF8, 0, cStr.GetString(), cStr.GetLength(), &utf8Str[0], sizeNeeded, NULL, NULL);
return utf8Str;
}
```
此函数利用了 Windows API 提供的 `WideCharToMultiByte` 方法来处理宽字符向多字节编码(UTF-8)的转换过程[^2]。
---
#### 3. **注意事项**
- 如果项目的编译选项不是 Unicode,而是 ANSI/MBCS,则可以直接使用简单的指针操作进行转换。
- 使用动态分配内存时需要注意及时释放资源以防止内存泄漏。
- 上述两种转换均假设输入数据为有效的 UTF-8 或宽字符集编码。
---
### 示例程序展示完整的互转逻辑
下面是一个综合示例,展示了如何双向转换 `std::string` 和 `CString` 并验证其结果:
```cpp
#include <atlstr.h>
#include <iostream>
// 定义两个方向的转换函数
CString StdStringToCString(const std::string& strSource) {
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &strSource[0], (int)strSource.size(), nullptr, 0);
std::wstring result(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &strSource[0], (int)strSource.size(), &result[0], size_needed);
return CString(result.c_str());
}
std::string CStringToStdString(const CString& cStr) {
int sizeNeeded = ::WideCharToMultiByte(CP_UTF8, 0, cStr.GetString(), cStr.GetLength(), NULL, 0, NULL, NULL);
std::string utf8Str(sizeNeeded, '\0');
::WideCharToMultiByte(CP_UTF8, 0, cStr.GetString(), cStr.GetLength(), &utf8Str[0], sizeNeeded, NULL, NULL);
return utf8Str;
}
int main() {
// 测试标准库字符串 -> CString
std::string originalStdString = "Hello, world!";
CString convertedCString = StdStringToCString(originalStdString);
// 输出中间结果
std::wcout << L"CString Result: " << (LPCTSTR)convertedCString << std::endl;
// 再次测试 CString -> 标准库字符串
std::string finalStdString = CStringToStdString(convertedCString);
// 验证最终结果是否一致
if (originalStdString == finalStdString) {
std::cout << "Conversion successful!" << std::endl;
} else {
std::cout << "Conversion failed." << std::endl;
}
return 0;
}
```
以上代码实现了完整的双向转换流程并进行了基本校验[^1][^2]。
---
阅读全文
相关推荐

















