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

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

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

      CMake構建學習筆記20-iconv庫的構建

      1. 構建

      iconv是一個用于在不同字符編碼(如 UTF-8、GBK、ISO-8859-1 等)之間進行轉換的開源庫。筆者在《c++中utf8字符串和gbk字符串的轉換》這篇文章中介紹過如何在Windows下實現utf8字符串和gbk字符串的轉換,不過該實現是基于Win32 API的,在其他平臺中是無法使用的。如果需要跨平臺,那么就需要使用iconv這樣的庫來統一實現。

      不過麻煩的是iconv是GNU/Linux項目提供的庫,不提供CMake的構建方式,以及原生的MSCV的構建方式。在Windows下的構建官方推薦使用MSYS2來進行構建。不過MSYS2構建出來的成果不一定能與MSVC構建的成果二進制兼容,而在Windows下還是使用MSVC的情況比較多。所以這就有點僵住了,只能尋求第三方的幫助。

      這里筆者的解決方案是直接使用vcpkg。vcpkg是微軟開發的C/C++跨平臺開源庫管理工具,試用了一下,感覺確實比以前進步很多,如果不是像筆者一樣有自己的需求,完全可以都使用vcpkg來安裝依賴庫。

      通過以下指令下載并安裝iconv:

      git clone https://github.com/microsoft/vcpkg
      cd vcpkg
      .\bootstrap-vcpkg.bat
      .\vcpkg install libiconv:x64-windows
      

      iconv就會安裝在vcpkg的目錄下,如下圖所示:

      iconv是個底層庫,不需要其他依賴庫,因此可以直接復制到筆者的倉庫中使用,算是滿足了筆者的需求。另外,不知道vcpkg的機制是什么,vcpkg確實也使用了cmake來構建,因為生成了cmake的配置文件,可以直接被CMake項目集成使用。最后,默認情況下vcpkg會檢測環境內的VS,使用最高版本的VS來編譯鏈接,構建的時候要保證與目標版本一致。

      2. 示例

      最后就直接給一個CMake項目調用剛才安裝好的iconv庫的示例吧。因為vcpkg在安裝iconv的時候,也安裝了相應的cmake的配置文件,所以可以直接在CMakeLists.txt集成,關鍵配置代碼是:

      # 項目代碼設置為utf-8編碼
      if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
          message(">> using Clang")
      elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
          message(">> using GCC")
      elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
          message(">> using Intel C++")
      elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
          message(">> using Visual Studio C++")
          add_compile_options("/utf-8")
      else()
          message(">> unknow compiler.")
      endif()
      
      find_package(Iconv REQUIRED)
      
      # ...
      
      target_link_libraries(${PROJECT_NAME} PRIVATE Iconv::Iconv)
      

      注意,find_package要生效,需要保證CMake能夠搜索到相應的庫。如果是直接使用的vcpkg,那么需要將vcpkg集成到CMake搜索路徑中:

      vcpkg integrate install
      

      如果是像筆者一樣,是將iconv復制到自己倉庫中使用,那么需要在CMake的內置變量CMAKE_PREFIX_PATH中增加自己的倉庫路徑(比如修改CMakePresets.json文件中CMAKE_PREFIX_PATH的配置)。

      將utf8編碼字符串轉換成gbk字符串的代碼示例如下:

      #include <iconv.h>
      
      using namespace std;
      
      int main() {
        // 原始 UTF-8 字符串
        const char *utf8_str = "你好,世界!";
      
        printf("%s\n", utf8_str);
      
        size_t in_bytes_left = strlen(utf8_str);
        char in_buf[1024];
        strcpy(in_buf, utf8_str);
        char *in_ptr = in_buf;
      
        // 輸出緩沖區(GBK)
        char out_buf[1024];
        char *out_ptr = out_buf;
        size_t out_bytes_left = sizeof(out_buf);
      
        // 打開 iconv 轉換器:從 UTF-8 轉換到 GBK
        iconv_t cd = iconv_open("GBK", "UTF-8");
        if (cd == (iconv_t)-1) {
          perror("iconv_open failed");
          return 1;
        }
      
        // 執行轉換
        if (iconv(cd, &in_ptr, &in_bytes_left, &out_ptr, &out_bytes_left) ==
            (size_t)(-1)) {
          perror("iconv failed");
          iconv_close(cd);
          return 1;
        }
      
        // 關閉轉換器
        iconv_close(cd);
      
        // 獲取實際轉換后的長度
        size_t converted_len = sizeof(out_buf) - out_bytes_left;
      
        // 直接寫入二進制字節到 stdout(不經過 printf,防止轉碼)
        fwrite(out_buf, 1, converted_len, stdout);
      
        return 0;
      }
      

      運行結果如下所示:

      浣犲ソ錛屼笘鐣岋紒
      你好,世界!
      
      posted @ 2025-08-26 21:44  charlee44  閱讀(163)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲av午夜福利精品一区二区| 久久一级精品久熟女人妻| 亚洲色大成网站WWW国产| 盐边县| 最新精品国产自偷在自线| 日韩有码中文字幕国产| av鲁丝一区鲁丝二区鲁丝三区| 亚洲香蕉免费有线视频| 92精品国产自产在线观看481页| 国产毛片子一区二区三区| 老鸭窝在钱视频| 中国女人内谢69xxxx| 无码任你躁久久久久久老妇 | 熟妇高潮精品一区二区三区| 无码国产欧美一区二区三区不卡| 丝袜美腿视频一区二区三区| 免费萌白酱国产一区二区三区| 最新精品国产自偷在自线| 公与淑婷厨房猛烈进出视频免费 | 成人无码潮喷在线观看| a∨变态另类天堂无码专区| 国产一区二区av天堂热| 国产精品美人久久久久久AV| 亚洲乱码精品久久久久..| 欧美xxxx做受欧美.88| 含山县| 老熟女重囗味hdxx69| 亚洲欧洲日产国码无码久久99| 欧美日韩国产图片区一区| 日韩免费码中文在线观看| 中文字幕亚洲综合久久| 久久亚洲国产五月综合网 | 国产精品人妻熟女男人的天堂 | 怀仁县| 亚洲精品一区二区制服| 国产精品护士| 成人免费ā片在线观看| 四虎成人在线观看免费| 国产精品毛片无遮挡高清| 日本一区二区三区18岁| 欧美激情内射喷水高潮|