一、使用c++11标准库codecvt转换字符编码

在 C++11 中,可以使用 std::codecvt 类来执行字符集转换。虽然在 C++17 中已经被弃用,但在 C++11 中仍然可以使用它。
std::wstring_convert配合std::codecvt模板类。
这两个模板类的功能是:
std::wstring_convert:转码器,接收一个类似codecvt描述编码转换特性的模板参数,用于将本地化的宽字符wstring和指定编码的字节化string进行互转。
std::codecvt:编码转换特性类,用在wstring_convert的模板参数中来指定使用哪种编码。std::codecvt_utf8<wchar_t>:用于UTF8和本地化wchar_t的互转。

下面是一个简单的示例代码。

#include <iostream>
#include <locale>
#include <codecvt>
#include <string>

int main() {
    // 创建一个 std::wstring,存储需要转换的字符串
    std::wstring utf16_string = L"你好,世界!";

    // 创建一个 std::wstring_convert,用于进行字符集转换
    std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_convert;
    std::string utf8_string = utf8_convert.to_bytes(utf16_string);

    // 输出 UTF-8 编码的字符串
    std::cout << "UTF-8: " << utf8_string << std::endl;

    // 创建一个 std::codecvt<wchar_t, char, mbstate_t>,用于进行 GBK 到 UTF-16 的转换
    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> gbk_convert;
    std::wstring gbk_string = gbk_convert.from_bytes(utf8_string);

    // 输出 GBK 编码的字符串
    std::wcout.imbue(std::locale("zh_CN.GBK")); // 设置输出流的本地化
    std::wcout << "GBK: " << gbk_string << std::endl;
    
    
     //wstring 转 string
    std::wstring str = L"你好,世界!";
    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> converter(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));
    
    std::string narrowStr = converter.to_bytes(str);
    
     //string 转 wstring
    std::wstring wstr = converter.from_bytes(narrowStr);
    std::cout<<narrowStr<<'\n';
    std::wcout.imbue(std::locale("chs"));   //初始化cout为中文输出
    std::wcout<<wstr<<'\n';

    return 0;
}

二、使用c++17标准库codecvt转换字符编码

在 C++17 中,std::codecvt 类已经被弃用,推荐使用其他替代方案来进行字符集转换。一个常见的替代方案是使用 std::wstring_convert 和 std::codecvt_utf8 或 std::codecvt_utf16 类来执行 UTF-8 或 UTF-16 编码的转换。
下面是一个简单的示例代码。

#include <iostream>
#include <locale>
#include <codecvt>
#include <string>

int main() {
    // 创建一个 std::wstring,存储需要转换的字符串
    std::wstring utf16_string = L"你好,世界!";

    // 创建一个 std::wstring_convert,用于进行字符集转换
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
    std::string utf8_string = convert.to_bytes(utf16_string);

    // 输出 UTF-8 编码的字符串
    std::cout << "UTF-8: " << utf8_string << std::endl;

    // 将 UTF-8 编码的字符串转换回 UTF-16 编码的字符串
    std::wstring converted_utf16_string = convert.from_bytes(utf8_string);

    // 输出转换后的 UTF-16 编码的字符串
    std::wcout.imbue(std::locale("")); // 设置输出流的本地化
    std::wcout << "UTF-16: " << converted_utf16_string << std::endl;

    return 0;
}

在这个示例中,我们首先创建了一个 UTF-16 编码的 std::wstring 字符串 utf16_string,然后使用 std::wstring_convert 进行 UTF-16 到 UTF-8 的转换,得到了 UTF-8 编码的字符串 utf8_string。接着,我们再将 UTF-8 编码的字符串转换回 UTF-16 编码的字符串,并输出转换后的结果。
这种方法比使用 std::codecvt 更加简单和直观,而且不再需要手动创建 std::locale 对象。

以下是一个使用std::wstring_convert进行GBK到Unicode和Unicode到GBK的简单示例。

#include <iostream>
#include <codecvt>
#include <locale>
#include <string>

int main() {
    // GBK 编码的字符串
    std::string gbkString = "你好,世界!";
    
    // 将 GBK 转换为 Unicode(UTF-16)
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    std::wstring unicodeString = converter.from_bytes(gbkString);
    
    // 输出 Unicode 编码的字符串
    std::wcout << L"Unicode: " << unicodeString << std::endl;
    
    // 将 Unicode 转换为 GBK
    std::string convertedGBKString = converter.to_bytes(unicodeString);
    
    // 输出转换后的 GBK 编码的字符串
    std::cout << "GBK: " << convertedGBKString << std::endl;

    return 0;
}

使用C++17中提供的std::codecvt_utf8_utf16 facet。实际上,标准库中没有直接提供GBK编码的std::codecvt facet,因此这个示例是使用UTF-8和UTF-16进行转换,而不是直接的GBK编码转换。在实际项目中,你可能需要使用其他库或方法来进行更准确的GBK编码和Unicode编码之间的转换。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐