用c++写一段程序 支持utf8和gbk之间的转化 要求跨平台
时间: 2023-11-22 09:54:12 浏览: 109
以下是使用C++实现UTF-8和GBK之间转换的示例代码,支持跨平台:
```c++
#include <iostream>
#include <string>
#include <codecvt>
#include <locale>
#ifdef _WIN32
#include <Windows.h>
#endif
std::wstring utf8_to_wstring(const std::string& str)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes(str);
}
std::string wstring_to_utf8(const std::wstring& wstr)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.to_bytes(wstr);
}
std::wstring gbk_to_wstring(const std::string& str)
{
#ifdef _WIN32
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, buf, len);
std::wstring wstr(buf);
delete[] buf;
#else
std::wstring_convert<std::codecvt_byname<wchar_t, char, std::mbstate_t>> converter(new std::locale("zh_CN.GBK"));
std::wstring wstr = converter.from_bytes(str);
#endif
return wstr;
}
std::string wstring_to_gbk(const std::wstring& wstr)
{
#ifdef _WIN32
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
char* buf = new char[len];
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, buf, len, NULL, NULL);
std::string str(buf);
delete[] buf;
#else
std::wstring_convert<std::codecvt_byname<wchar_t, char, std::mbstate_t>> converter(new std::locale("zh_CN.GBK"));
std::string str = converter.to_bytes(wstr);
#endif
return str;
}
int main()
{
std::string utf8_str = u8"你好,世界!";
std::wstring wstr1 = utf8_to_wstring(utf8_str);
std::string gbk_str = "\xC4\xE3\xBA\xC3\xA3\xAC\xCA\xC0\xBD\xE7\xA1\xA3";
std::wstring wstr2 = gbk_to_wstring(gbk_str);
std::string utf8_str2 = wstring_to_utf8(wstr2);
std::string gbk_str2 = wstring_to_gbk(wstr1);
std::cout << utf8_str << " => " << wstr1 << " => " << utf8_str2 << std::endl;
std::cout << gbk_str << " => " << wstr2 << " => " << gbk_str2 << std::endl;
return 0;
}
```
此代码使用了C++11的`std::codecvt`和`std::wstring_convert`来进行字符编码转换。在Windows平台上,还使用了`MultiByteToWideChar`和`WideCharToMultiByte`函数来进行GBK和Unicode之间的转换。代码中使用了`#ifdef _WIN32`来判断是否为Windows平台,从而使用不同的实现。对于其他平台,可以使用相应的库来进行GBK和Unicode之间的转换。
示例代码中使用了两个函数进行编码转换:
- `utf8_to_wstring`: 将UTF-8编码的字符串转换为Unicode字符串(`std::wstring`)。
- `gbk_to_wstring`: 将GBK编码的字符串转换为Unicode字符串(`std::wstring`)。
还提供了两个函数进行反向转换:
- `wstring_to_utf8`: 将Unicode字符串(`std::wstring`)转换为UTF-8编码的字符串。
- `wstring_to_gbk`: 将Unicode字符串(`std::wstring`)转换为GBK编码的字符串。
可以根据实际需要选择相应的函数进行编码转换。在实际使用时,应确保所使用的编译器和库支持UTF-8和GBK编码。
阅读全文