<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      c++中utf8字符串和gbk字符串的轉換

      這個功能C++語言本身似乎沒有標準實現,需要借助于第三方庫或者操作系統API。不得不吐槽一下這么重要的功能居然還沒有辦法依賴C++語言本身來實現,C++標準委員會真是不干人事啊。那就不廢話了,直接給出windows下的實現。

      std::string Utf8ToGbk(const std::string& utf8Str) {
        // Step 1: Convert UTF-8 to Wide Char (UTF-16)
        int wideCharLen =
            MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_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, utf8Str.c_str(), -1, &wideStr[0],
                            wideCharLen);
      
        // Step 2: Convert Wide Char (UTF-16) to GBK
        int gbkLen = WideCharToMultiByte(CP_ACP, 0, wideStr.c_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, wideStr.c_str(), -1, &gbkStr[0], gbkLen,
                            nullptr, nullptr);
      
        // Remove the null terminator added by the conversion functions
        gbkStr.pop_back();
      
        return gbkStr;
      }
      
      std::string GbkToUtf8(const std::string& gbkStr) {
        // Step 1: Convert GBK to Wide Char (UTF-16)
        int wideCharLen =
            MultiByteToWideChar(CP_ACP, 0, gbkStr.c_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, gbkStr.c_str(), -1, &wideStr[0], wideCharLen);
      
        // Step 2: Convert Wide Char (UTF-16) to UTF-8
        int utf8Len = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_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, wideStr.c_str(), -1, &utf8Str[0], utf8Len,
                            nullptr, nullptr);
      
        // Remove the null terminator added by the conversion functions
        utf8Str.pop_back();
      
        return utf8Str;
      }
      

      這段代碼的原理很簡單:

      1. CP_ACP的意思就是本地編碼,就是操作系統系統定義的默認編碼,依賴于當前操作系統的語言和地區設置。在中文環境下就是GBk系列的中文編碼,例如GB2312、GBK或GB18030。
      2. 需要使用寬字節字符串來進行中轉,在Windows下,std::wstring是16字節字符串,使用UTF-16編碼。這一點有點類似于C#的string和Java的string,都是UTF-16編碼。
      3. MultiByteToWideChar和WideCharToMultiByte都是操作系統的C接口,輸入和返回的字符串都帶'\0',因此轉到c++的string需要去掉最后的'\0'字符。這一點需要注意。

      測試了用例沒有問題。測試Utf8ToGbk:

        // string utfStr = u8"這是一個測試的中文字符串,檢查一下";
        // string utfStr = u8"測試";
        string utfStr = u8"abcdefg";
      
        string gbkStr = Utf8ToGbk(utfStr);
      
        // cout << gbkStr << "-------" << endl;
        // cout << gbkStr.length() << endl;
        // cout << gbkStr.c_str() << endl;
        // cout << strlen(gbkStr.c_str()) << endl;
      

      測試GbkToUtf8:

      #ifdef _WIN32
        SetConsoleOutputCP(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庫。

      posted @ 2024-09-16 22:23  charlee44  閱讀(411)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲成人av综合一区| 337p粉嫩大胆噜噜噜| 日本高清视频网站www| 久热这里有精品视频在线| 蜜桃av亚洲第一区二区| 国产真实伦在线观看视频| 人人妻一区二区三区| 浪潮av色综合久久天堂| 亚洲av本道一区二区| 福利无遮挡喷水高潮| 黄又色又污又爽又高潮| 自拍偷自拍亚洲精品播放| 亚洲欧美综合人成在线| 国产一区二区在线影院| 少妇人妻无码专区在线视频| 亚洲国产中文字幕在线视频综合| 人人澡超碰碰97碰碰碰| 国产午夜福利精品视频| 亚洲欧美日韩愉拍自拍| 久久久精品94久久精品| 激情亚洲内射一区二区三区 | 亚洲av高清一区二区三| japanese无码中文字幕| 亚洲av无码精品色午夜蛋壳| 99在线精品免费视频| аⅴ天堂中文在线网| 国产欧美精品一区二区三区-老狼 真实单亲乱l仑对白视频 | 无遮挡aaaaa大片免费看| 青青国产揄拍视频| 亚洲人成人网站色www| 国产亚洲精品中文字幕| 在线视频不卡在线亚洲| 人妻日韩人妻中文字幕| 中文字幕日韩有码第一页| 办公室强奷漂亮少妇同事| 日本一区二区三区在线 |观看| 肉大捧一进一出免费视频| 中文字幕日韩精品亚洲一区| 办公室强奷漂亮少妇视频| 国产在线精品无码二区| av午夜福利亚洲精品福利|