不说太多,直接上代码
string UTF8ToGBK(const char* strUTF8) {
const char* to_encoding = "CP936"; // Linux 用 "CP936",Windows 可用 "GBK"
const char* from_encoding = "UTF-8";
iconv_t cd = iconv_open(to_encoding, from_encoding);
if (cd == (iconv_t)-1) {
throw std::runtime_error("Failed to initialize iconv");
}
// 正确的 RAII 管理
struct IconvGuard {
iconv_t cd_;
IconvGuard(iconv_t cd) : cd_(cd) {}
~IconvGuard() { if (cd_ != (iconv_t)-1) iconv_close(cd_); }
} guard(cd);
size_t in_bytes = strlen(strUTF8);
size_t out_bytes = in_bytes * 4; // 更安全的缓冲区大小,考虑中文情况
std::string result(out_bytes, '\0');
char* in_ptr = const_cast<char*>(strUTF8);
char* out_ptr = &result[0];
size_t original_out_bytes = out_bytes;
if (iconv(cd, &in_ptr, &in_bytes, &out_ptr, &out_bytes) == (size_t)-1) {
throw std::runtime_error(std::string("Encoding conversion failed: ") + strerror(errno));
}
// 调整大小以去除未使用的空间
result.resize(original_out_bytes - out_bytes);
return result;
}
string GBKToUTF8(const char* strGBK)
{
if (strGBK == nullptr) {
return "";
}
iconv_t cd = iconv_open("UTF-8", "GBK");
if (cd == (iconv_t)-1) {
throw std::runtime_error("Failed to open iconv descriptor");
}
size_t inbytes = strlen(strGBK);
size_t outbytes = inbytes * 4; // UTF-8最多使用4字节表示一个字符
std::unique_ptr<char[]> outbuf(new char[outbytes + 1]);
char* inptr = const_cast<char*>(strGBK);
char* outptr = outbuf.get();
memset(outptr, 0, outbytes + 1);
if (iconv(cd, &inptr, &inbytes, &outptr, &outbytes) == (size_t)-1) {
iconv_close(cd);
throw std::runtime_error("Conversion failed");
}
iconv_close(cd);
return std::string(outbuf.get());
}
863

被折叠的 条评论
为什么被折叠?



