C++20 中的std::c8rtomb和 std::mbrtoc8

文章目錄

      • 1. 引言
      • 2. `std::c8rtomb` 函數詳解
      • 3. `std::mbrtoc8` 函數詳解
      • 4. 使用示例
      • 5. 注意事項
      • 6. 總結

1. 引言

C++20 標準引入了對 UTF-8 編碼的更好支持,其中包括兩個重要的函數:std::c8rtombstd::mbrtoc8。這兩個函數分別用于將 UTF-8 編碼的字符轉換為窄多字節字符表示,以及將窄多字節字符轉換為 UTF-8 編碼。這些功能對于處理多語言文本和國際化應用非常關鍵。

2. std::c8rtomb 函數詳解

std::c8rtomb 函數用于將單個 UTF-8 編碼點轉換為窄多字節字符表示。其定義如下:

std::size_t c8rtomb(char* s, char8_t c8, std::mbstate_t* ps);
  • 參數

    • s:指向窄字符數組的指針,用于存儲轉換后的多字節字符。
    • c8:要轉換的 UTF-8 編碼單元。
    • ps:指向轉換狀態對象的指針,用于在解釋多字節字符串時使用。
  • 行為

    • 如果 s 不是空指針且 c8 是有效 UTF-8 編碼的最后一個編碼單元,則函數會確定存儲該編碼點的多字節字符表示所需的字節數(包括任何移位序列),并將多字節字符表示存儲在 s 指向的字符數組中,同時更新 *ps
    • 如果 c8 不是編碼點表示中的最后一個編碼單元,則函數不會寫入 s 指向的數組,只更新 *ps
    • 如果 s 是空指針,則調用等效于 std::c8rtomb(buf, u8'\0', ps),其中 buf 是某個內部緩沖區。
    • 如果 c8 是空字符 u8'\0',則存儲一個空字節,并在前面附加任何恢復初始移位狀態所需的移位序列,同時更新 *ps 以表示初始移位狀態。
  • 返回值

    • 返回存儲在數組中的字節數(包括任何移位序列)。如果 c8 不是編碼點的 UTF-8 表示中的最后一個編碼單元,則返回值可以為零。
    • 如果 c8 無效(不貢獻到對應合法多字節字符的 char8_t 序列),則將 EILSEQ 的值存儲在 errno 中,返回 static_cast<std::size_t>(-1),且轉換狀態未指定。

3. std::mbrtoc8 函數詳解

std::mbrtoc8 函數用于將窄多字節字符轉換為 UTF-8 編碼。其定義如下:

std::size_t mbrtoc8(char8_t* pc8, const char* s, std::size_t n, std::mbstate_t* ps);
  • 參數

    • pc8:指向 char8_t 類型的指針,用于存儲轉換后的 UTF-8 編碼。
    • s:指向多字節字符的指針。
    • ns 指向的數組中的最大字節數。
    • ps:指向轉換狀態對象的指針。
  • 行為

    • 函數將 s 指向的多字節字符轉換為 UTF-8 編碼,并存儲在 pc8 指向的位置。
    • 如果 s 指向的多字節字符無效,則函數的行為是未定義的。
  • 返回值

    • 返回轉換后的 UTF-8 編碼所需的字節數。

4. 使用示例

以下是一個簡單的示例,展示如何使用 std::c8rtombstd::mbrtoc8

#include <iostream>
#include <cuchar>
#include <cstring>
#include <clocale>int main() {// 設置 C 本地環境為 UTF-8std::setlocale(LC_ALL, "en_US.UTF-8");// 示例 UTF-8 字符串const char* utf8_str = u8"你好,世界!";// 轉換為多字節字符char mb_str[100];std::mbstate_t state = {};char* mb_ptr = mb_str;for (const char* p = utf8_str; *p; ) {char8_t c8 = *reinterpret_cast<const char8_t*>(p);std::size_t result = std::c8rtomb(mb_ptr, c8, &state);if (result == static_cast<std::size_t>(-1)) {std::cerr << "Invalid UTF-8 sequence encountered." << std::endl;return 1;}mb_ptr += result;p += std::char_traits<char>::length(reinterpret_cast<const char*>(&c8));}*mb_ptr = '\0';std::cout << "Multibyte string: " << mb_str << std::endl;// 轉換回 UTF-8char8_t utf8_result[100];char8_t* utf8_ptr = utf8_result;std::mbstate_t state2 = {};for (const char* p = mb_str; *p; ) {std::size_t result = std::mbrtoc8(utf8_ptr, p, 100, &state2);if (result == static_cast<std::size_t>(-1)) {std::cerr << "Invalid multibyte sequence encountered." << std::endl;return 1;}utf8_ptr += result;p += result;}*utf8_ptr = u8'\0';std::cout << "UTF-8 string: " << reinterpret_cast<const char*>(utf8_result) << std::endl;return 0;
}

5. 注意事項

  • 線程安全:以空指針參數 s 調用 std::c8rtomb 可能會與其他以空指針參數 sstd::c8rtomb 的調用造成數據競爭。
  • 本地環境依賴:這兩個函數的多字節編碼由當前活躍的 C 本地環境指定。
  • 錯誤處理:在處理無效的 UTF-8 序列或多字節字符時,需要妥善處理錯誤,避免程序崩潰。

6. 總結

C++20 通過引入 std::c8rtombstd::mbrtoc8,為處理 UTF-8 編碼和窄多字節字符提供了強大的支持。這些函數不僅增強了 C++ 標準庫對多語言文本的處理能力,還為國際化應用提供了更靈活的解決方案。開發者在使用這些函數時需要注意線程安全、本地環境依賴以及錯誤處理等問題,以確保程序的健壯性和可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75633.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75633.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75633.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI音樂生成革命:解讀昆侖萬維Mureka O1的技術突破與應用實踐

AI音樂生成革命&#xff1a;解讀昆侖萬維Mureka O1的技術突破與應用實踐 全球音樂產業正經歷AI技術重塑&#xff0c;昆侖萬維最新發布的音樂推理大模型Mureka O1引發行業震動。本文深度解析其技術原理與實測表現&#xff0c;揭開AI音樂創作新紀元的技術密碼 一、技術演進&…

《Operating System Concepts》閱讀筆記:p483-p488

《Operating System Concepts》學習第 40 天&#xff0c;p483-p488 總結&#xff0c;總計 6 頁。 一、技術總結 1.object storage (1)object storage 管理軟件 Hadoop file system(HDFS)、Ceph。 二、英語總結(生詞&#xff1a;1) 1.commodity (1)commodity: com-(“tog…

強化學習與神經網絡結合(以 DQN 展開)

目錄 基于 PyTorch 實現簡單 DQN double DQN dueling DQN Noisy DQN&#xff1a;通過噪聲層實現探索&#xff0c;替代 ε- 貪心策略 Rainbow_DQN如何計算連續型的Actions 強化學習中&#xff0c;智能體&#xff08;Agent&#xff09;通過與環境交互學習最優策略。當狀態空間或動…

“11.9元“引發的系統雪崩:Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 ?

&#x1f4a5; "11.9元"引發的系統雪崩&#xff1a;Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 &#x1f3af; &#x1f50d; 用 Mermaid原生防御體系圖 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

Cortex-M7進入異常中斷分析

使用cmbacktrace庫&#xff0c;其支持M3,4,7。 1、串口輸出異常信息 #define cmb_println(...) Debug_Printf(__VA_ARGS__)//cmb_println處理可變參數和格式化字符串 int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_star…

如何管理間接需求?團隊實踐分享

管理間接需求的核心方法包括明確需求識別流程、建立規范的需求管理體系、實施有效的需求溝通機制。 其中&#xff0c;明確需求識別流程最為關鍵。企業在實際業務中&#xff0c;往往會遇到大量的間接需求&#xff0c;如非直接生產性的采購需求、服務類需求等。這些需求往往隱蔽性…

與Aspose.pdf類似的jar庫分享

如果你在尋找類似于 Aspose.PDF 的 JAR 庫&#xff0c;這些庫通常用于處理 PDF 文檔的創建、編輯、轉換、合并等功能。以下是一些類似的 Java 庫&#xff0c;它們提供 PDF 處理的功能&#xff0c;其中一些是收費的&#xff0c;但也有開源選項&#xff1a; 1. iText (iText PDF…

2-2 MATLAB鮣魚優化算法ROA優化CNN超參數回歸預測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0.引言 1.ROA優化CNN 2.主程序調用 3.結語 0.引言 在博客【ROA優化LSTM超參數回歸】中&#xff0c;我們采用ROA對LSTM的學習率、迭代次數…

企業入駐成都國際數字影像產業園,可享150多項專業服務

企業入駐成都國際數字影像產業園&#xff0c;可享150多項專業服務 全方位賦能&#xff0c;助力影像企業騰飛 入駐成都國際數字影像產業園&#xff0c;企業將獲得一個涵蓋超過150項專業服務的全周期、一站式支持體系&#xff0c;旨在精準解決企業發展各階段的核心需求&#xf…

線路板元器件介紹及選型指南:提高電路設計效率

電路板&#xff08;PCB&#xff09;是現代電子設備的核心&#xff0c;其上安裝了各類電子元器件&#xff0c;這些元器件通過PCB的導電線路彼此連接&#xff0c;實現信號傳輸與功能執行。 元器件的選擇與安裝直接決定了電子產品的性能與穩定性。本文將為大家詳細介紹電路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原創標題&#xff1a;Arm Compiler for Embedded 6 的 Clang 版本 原創作者&#xff1a;莊曉立&#xff08;LIIGO&#xff09; 原創日期&#xff1a;20250218&#xff08;首發日期20250326&#xff09; 原創連接&#xff1a;https://blog.csdn.net/liigo/article/details/14653…

RedHat7.6_x86_x64服務器(最小化安裝)搭建使用記錄(二)

PostgreSQL數據庫部署管理 1.rpm方式安裝 掛載系統安裝鏡像&#xff1a; [rootlocalhost ~]# mount /dev/cdrom /mnt 進入安裝包路徑&#xff1a; [rootlocalhost ~]# cd /mnt/Packages 依次安裝如下程序包&#xff1a; [rootlocalhost Packages]# rpm -ihv postgresql-libs-9…

瀏覽器存儲 IndexedDB

IndexedDB 1. 什么是 IndexedDB&#xff1f; IndexedDB 是一種 基于瀏覽器的 NoSQL 數據庫&#xff0c;用于存儲大量的結構化數據&#xff0c;包括文件和二進制數據。它比 localStorage 和 sessionStorage 更強大&#xff0c;支持索引查詢、事務等特性。 IndexedDB 主要特點…

panda3d 渲染

目錄 安裝 設置渲染寬高&#xff1a; 渲染3d 安裝 pip install Panda3D 設置渲染寬高&#xff1a; import panda3d.core as pdmargin 100 screen Tk().winfo_screenwidth() - margin, Tk().winfo_screenheight() - margin width, height (screen[0], int(screen[0] / 1…

Node.js 包管理工具 - NPM 與 PNPM 清理緩存

NPM 清理緩存 1、基本介紹 npm 緩存是 npm 用來存儲已下載包的地方&#xff0c;以加快后續安裝速度 但是&#xff0c;有時緩存可能會損壞或占用過多磁盤空間&#xff0c;這時可以清理 npm 緩存 2、清理操作 執行如下指令&#xff0c;清理 npm 緩存 npm cache clean --for…

STM32F103_LL庫+寄存器學習筆記05 - GPIO輸入模式,捕獲上升沿進入中斷回調

導言 GPIO設置輸入模式后&#xff0c;一般會用輪詢的方式去查看GPIO的電平狀態。比如&#xff0c;最常用的案例是用于檢測按鈕的當前狀態&#xff08;是按下還是沒按下&#xff09;。中斷的使用一般用于計算脈沖的頻率與計算脈沖的數量。 項目地址&#xff1a;https://github.…

【C++進階二】string的模擬實現

【C進階二】string的模擬實現 1.構造函數和C_strC_str: 2.operator[]3.拷貝構造3.1淺拷貝3.2深拷貝 4.賦值5.迭代器6.比較ascll碼值的大小7.reverse擴容8.push_back尾插和append尾插9.10.insert10.1在pos位置前插入字符ch10.2在pos位置前插入字符串str 11.resize12.erase12.1從…

wokwi arduino mega 2560 - 點亮LED案例

截圖&#xff1a; 點亮LED案例仿真截圖 代碼&#xff1a; unsigned long t[20]; // 定義一個數組t&#xff0c;用于存儲20個LED的上次狀態切換時間&#xff08;單位&#xff1a;毫秒&#xff09;void setup() {pinMode(13, OUTPUT); // 將引腳13設置為輸出模式&#xff08;此…

vue3項目使用 python +flask 打包成桌面應用

server.py import os import sys from flask import Flask, send_from_directory# 獲取靜態文件路徑 if getattr(sys, "frozen", False):# 如果是打包后的可執行文件base_dir sys._MEIPASS else:# 如果是開發環境base_dir os.path.dirname(os.path.abspath(__file…

后端學習day1-Spring(八股)--還剩9個沒看

一、Spring 1.請你說說Spring的核心是什么 參考答案 Spring框架包含眾多模塊&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整個Spring框架的核心模塊。Core模塊提供了IoC容器、AOP功能、數據綁定、類型轉換等一系列的基礎功能&#xff0c;…