c++中utf8字符串和gbk字符串的转换
c++中utf8字符串和gbk字符串的转换
这个功能C++语言本身似乎没有标准实现,需要借助于第三方库或者操作系统API。不得不吐槽一下这么重要的功能居然还没有办法依赖C++语言本身来实现,C++标准委员会真是不干人事啊。那就不废话了,直接给出windows下的实现。代码语言:javascript代码运行次数:0运行复制std::string Utf8ToGbk(ct std::string
c++中utf8字符串和gbk字符串的转换
这个功能C++语言本身似乎没有标准实现,需要借助于第三方库或者操作系统API。不得不吐槽一下这么重要的功能居然还没有办法依赖C++语言本身来实现,C++标准委员会真是不干人事啊。那就不废话了,直接给出windows下的实现。
代码语言:javascript代码运行次数:0运行复制std::string Utf8ToGbk(ct std::string& utf8Str) {
// Step 1: Convert UTF-8 to Wide Char (UTF-16)
int wideCharLen =
MultiByteToWideChar(CP_UTF8, 0, _str(), -1, nullptr, 0);
if (wideCharLen == 0) {
throw std::runtime_error("Failed to convert from UTF-8 to wide char.");
}
std::wstring wideStr(wideCharLen, 0);
MultiByteToWideChar(CP_UTF8, 0, _str(), -1, &wideStr[0],
wideCharLen);
// Step 2: Convert Wide Char (UTF-16) to GBK
int gbkLen = WideCharToMultiByte(CP_ACP, 0, _str(), -1, nullptr, 0,
nullptr, nullptr);
if (gbkLen == 0) {
throw std::runtime_error("Failed to convert from wide char to GBK.");
}
std::string gbkStr(gbkLen, 0);
WideCharToMultiByte(CP_ACP, 0, _str(), -1, &gbkStr[0], gbkLen,
nullptr, nullptr);
// Remove the null terminator added by the conversion functi
gbkStr.pop_back();
return gbkStr;
}
std::string GbkToUtf8(ct std::string& gbkStr) {
// Step 1: Convert GBK to Wide Char (UTF-16)
int wideCharLen =
MultiByteToWideChar(CP_ACP, 0, _str(), -1, nullptr, 0);
if (wideCharLen == 0) {
throw std::runtime_error("Failed to convert from GBK to wide char.");
}
std::wstring wideStr(wideCharLen, 0);
MultiByteToWideChar(CP_ACP, 0, _str(), -1, &wideStr[0], wideCharLen);
// Step 2: Convert Wide Char (UTF-16) to UTF-8
int utf8Len = WideCharToMultiByte(CP_UTF8, 0, _str(), -1, nullptr, 0,
nullptr, nullptr);
if (utf8Len == 0) {
throw std::runtime_error("Failed to convert from wide char to UTF-8.");
}
std::string utf8Str(utf8Len, 0);
WideCharToMultiByte(CP_UTF8, 0, _str(), -1, &utf8Str[0], utf8Len,
nullptr, nullptr);
// Remove the null terminator added by the conversion functi
utf8Str.pop_back();
return utf8Str;
}
这段代码的原理很简单:
- CP_ACP的意思就是本地编码,就是操作系统系统定义的默认编码,依赖于当前操作系统的语言和地区设置。在中文环境下就是GBk系列的中文编码,例如GB212、GBK或GB1800。
- 需要使用宽字节字符串来进行中转,在Windows下,std::wstring是16字节字符串,使用UTF-16编码。这一点有点类似于C#的string和Java的string,都是UTF-16编码。
- MultiByteToWideChar和WideCharToMultiByte都是操作系统的C接口,输入和返回的字符串都带'\0',因此转到c++的string需要去掉最后的'\0'字符。这一点需要注意。
测试了用例没有问题。测试Utf8ToGbk:
代码语言:javascript代码运行次数:0运行复制 // string utfStr = u8"这是一个测试的中文字符串,检查一下";
// string utfStr = u8"测试";
string utfStr = u8"abcdefg";
string gbkStr = Utf8ToGbk(utfStr);
// cout << gbkStr << "-------" << endl;
// cout << gbkStr.length() << endl;
// cout << _str() << endl;
// cout << strlen(_str()) << endl;
测试GbkToUtf8:
代码语言:javascript代码运行次数:0运行复制#ifdef _WI2
SetColeOutputCP(65001);
#endif
// string gbkStr = "测试";
string gbkStr = "这是一个测试的中文字符串,检查一下";
// string gbkStr = "abcdefg";
cout << gbkStr.length() << endl;
string utfStr = GbkToUtf8(gbkStr);
cout << utfStr << endl;
cout << utfStr.length() << endl;
以上是Windows的实现,Linux环境要使用别的办法,例如使用iconv库。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-09-16,如有侵权请联系 cloudcommunity@tencent 删除测试字符串c++utf8编码#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-28 17:32:09
上一篇:CMake构建学习笔记17
下一篇:CMake构建学习笔记16
推荐阅读
留言与评论(共有 17 条评论) |
本站网友 如何计算排卵期 | 11分钟前 发表 |
&wideStr[0] | |
本站网友 粳米是什么 | 22分钟前 发表 |
wideCharLen); // Step 2 | |
本站网友 天空飘来五个字 | 8分钟前 发表 |
这一点需要注意 | |
本站网友 深圳买房网 | 16分钟前 发表 |
本站网友 胎儿体重 | 17分钟前 发表 |
_str() | |
本站网友 莫高义 | 15分钟前 发表 |
nullptr); if (utf8Len == 0) { throw std | |
本站网友 都可喜 | 25分钟前 发表 |
runtime_error("Failed to convert from UTF-8 to wide char."); } std | |
本站网友 solarworld | 3分钟前 发表 |
代码语言:javascript代码运行次数:0运行复制std | |
本站网友 北京朝阳区二手房 | 16分钟前 发表 |
0 | |
本站网友 贵阳市委书记 | 2分钟前 发表 |
这一点有点类似于C#的string和Java的string | |
本站网友 三花聚顶 | 9分钟前 发表 |
runtime_error("Failed to convert from GBK to wide char."); } std | |
本站网友 仓库管理流程图 | 17分钟前 发表 |
MultiByteToWideChar和WideCharToMultiByte都是操作系统的C接口 | |
本站网友 shanghaiyidong | 25分钟前 发表 |
nullptr); // Remove the null terminator added by the conversion functi gbkStr.pop_back(); return gbkStr; } std | |
本站网友 北京第二机场 | 28分钟前 发表 |
本站网友 harpoon | 13分钟前 发表 |
0 | |
本站网友 黄甘霖 | 2分钟前 发表 |