8.3 C++11對Unicode的支持

一、C++11對Unicode的支持

在C++98中,引入wchar_t對Unicode支持,但是后來由于不同平臺下wchar_t的寬度并不相同(8,16,32位),導致可移植性受到影響。因此從C++11開始引入了char16_t、char32_t以及原有的char,分別存儲utf16,utf32和utf8編碼的數據。

此外還定義了字符串常量的前綴:

  • u8表示以utf8編碼
  • u表示utf16編碼
  • U表示utf32編碼

以上三種,再加上wchar_t格式的L以及不帶前綴的字符串,C++11則包含了5種字符串常量的前綴。

通常情況下,對于連續的字符串常量,C++會要求編譯器將其連起來,比如"a" "b"和"ab"沒有區別。

此外,對于多個連續聲明的字符串常量,只要有一個有前綴,則編譯器會將這些連續的字符串常量都以此前綴處理。(實際上vs2017并不允許)

此外,C++11還支持"\u十六進制碼位"表示unicode字符。

std::string  str = "\u4F60\u597d";	//中文字符:你好

而想要正確顯示一個字符(不亂碼),要求輸入編碼格式、文件存儲編碼格式,編譯時選擇的編碼格式、以及輸出顯示編碼格式四者一致才能正確,否則都會出現亂碼的現象。

二、對于Unicode庫的支持

1.單碼位轉換

        size_t mbrtoc16(char16_t * pc16, const char * s, size_t n, mbstate_t * ps);size_t c16rtomb(char * s, char16_t c16, mbstate _t * ps);size_t mbrtoc32(char32_t * pc32, const char * s, size_t n, mbstate_t * ps);size_t c32rtomb(char * s, char32_t c32, mbstate_t * ps);

mb表示multiple bytes,這四個函數都表示單碼位的轉換。

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string>int main()
{std::setlocale(LC_ALL, "en_US.utf8");std::u16string strv = u"z?水🍌"; // or z\u00df\u6c34\U0001F34Cstd::cout << "Processing " << strv.size() << " UTF-16 code units: [ ";for (char16_t c : strv)std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';std::cout << "]\n";std::mbstate_t state{};char out[MB_LEN_MAX]{};for (char16_t c : strv){std::size_t rc = std::c16rtomb(out, c, &state);std::cout << static_cast<int>(c) << " converted to [ ";if (rc != (std::size_t) - 1)for (unsigned char c8 : std::string{ out, rc })std::cout << +c8 << ' ';std::cout << "]\n";}
}
#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>int main()
{std::setlocale(LC_ALL, "en_US.utf8");std::string str = "z\u00df\u6c34\U0001F34C"; // or u8"z?水🍌"std::cout << "Processing " << str.size() << " bytes: [ " << std::showbase;for (unsigned char c : str)std::cout << std::hex << +c << ' ';std::cout << "]\n";std::mbstate_t state{}; // zero-initialized to initial statechar16_t c16;const char *ptr = &str[0], *end = &str[0] + str.size();while (std::size_t rc = std::mbrtoc16(&c16, ptr, end - ptr + 1, &state)){std::cout << "Next UTF-16 char: " << std::hex<< static_cast<int>(c16) << " obtained from ";if (rc == (std::size_t) - 3)std::cout << "earlier surrogate pair\n";else if (rc == (std::size_t) - 2)break;else if (rc == (std::size_t) - 1)break;else{std::cout << std::dec << rc << " bytes [ ";for (std::size_t n = 0; n < rc; ++n)std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';std::cout << "]\n";ptr += rc;}}
}

2.多碼位轉換

        std::codecvt<char, char, std::mbstate_t>          // 完成多字節與char之間的轉換std::codecvt<char16_t, char, std::mbstate_t>      // 完成UTF-16與UTF-8間的轉換std::codecvt<char32_t, char, std::mbstate_t>      // 完成UTF-32與UTF-8間的轉換std::codecvt<wchar_t, char, std::mbstate_t>       // 完成多字節與wchar_t之間的轉換

以及派生codecvt_utf8、codecvt_utf16、codecvt_utf8_utf16等可以用于字符串轉換的模板類。這些模板類配合C++11定義的wstring_convert模板,可以進行一些不同字符串的轉換。

三、原生字符串字面量支持

C++11開始支持原生字符串字面量,語法是R"(string)".

#include <iostream>int main()
{std::cout << "12345\t\n890" << std::endl;std::cout << R"(12345\t\n890)" << std::endl;
}

輸出:

12345
890
12345\t\n890

而原生字符串字面值也可以添加前綴u,u8,U等表示字符編碼內容:

	std::cout << uR"(12345\t\n890)" << std::endl;std::cout << UR"(12345\t\n890)" << std::endl;std::cout << u8R"(12345\t\n890)" << std::endl;

輸出:

006DEBE4
006DEB3C
12345\t\n890

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

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

相關文章

邊緣端部署的典型目標識別網絡

邊緣端&#xff08;Edge&#xff09;部署深度學習目標檢測網絡通常涉及到在資源受限的設備上執行模型推斷。這里有一些邊緣端部署深度學習目標檢測網絡的常見策略和技術&#xff1a; 輕量化模型&#xff1a; 選擇或設計輕量級的深度學習模型&#xff0c;例如MobileNet、Squeez…

來自OpenAI的官方解釋:ChatGPT中的GPTs與Assistants API的區別是什么?有什么差異?

本文原文來自DataLearnerAI的官方網站&#xff1a; 來自OpenAI的官方解釋&#xff1a;ChatGPT中的GPTs與Assistants API的區別是什么&#xff1f;有什么差異&#xff1f; | 數據學習者官方網站(Datalearner)https://www.datalearner.com/blog/1051701996595465 OpenAI發布的產…

圖解算法數據結構-LeetBook-查找01_第一個只出現一次的字符

某套連招動作記作僅由小寫字母組成的序列 arr&#xff0c;其中 arr[i] 第 i 個招式的名字。請返回第一個只出現一次的招式名稱&#xff0c;如不存在請返回空格。 示例 1&#xff1a; 輸入&#xff1a;arr “abbccdeff” 輸出&#xff1a;‘a’ 示例 2&#xff1a; 輸入&…

3D Web輕量引擎HOOPS Communicator如何實現對大模型的渲染支持?

除了讀取輕松外&#xff0c;HOOPS Communicator對超大模型的支持效果也非常好&#xff0c;它可以支持30GB的包含70萬個零件和3.5億個三角面的Catia裝配模型&#xff01; 那么它是如何來實現對大模型的支持呢&#xff1f; 我們將從以下幾個方面與大家分享&#xff1a;最低幀率…

python核心階段(五)—— 面向對象三大特性

1.封裝 概念&#xff1a;封裝主要是指將一些屬性和相關方法封裝在一個對象中&#xff0c;對外隱藏內部具體實現細節 作用&#xff1a;1&#xff09;使用起來更加方便&#xff0c;類似于提供了一個工具箱 2&#xff09;保證數據的安全&#xff08;設置私有屬性&#xff09; 3&am…

高精度加法,減法,乘法,除法(下)(C語言)

前言 上一篇博客我們分享了高精度加法&#xff0c;減法,這一期我將為大家講解高精度乘法和高精度除法。那讓我們開始吧&#xff01; 對加法和減法感興趣的話就點我 文章目錄 1&#xff0c;乘法2&#xff0c;除法3&#xff0c;尾聲 1&#xff0c;乘法 讓我們想想我們平時做數學…

openpyxl讀取Excel文件忽略單元格公式僅讀取所顯示的值

目錄 前言解決方案先不加&#xff1a;看讀取信息加上參數&#xff1a;看讀取信息完整代碼 前言 我們在讀取Excel文件時&#xff0c;假如某行或者某列是利用公式生成的&#xff0c;但是我們在利用openpyxl進行讀取時&#xff0c;發現讀取到的是公式&#xff0c;而非顯示的值 解…

Java并行和并發有什么區別?

Java并行和并發有什么區別&#xff1f; 并行和并發是兩個在多線程編程中經常使用的概念&#xff0c;它們描述了不同的多任務處理方式。 并發&#xff08;Concurrency&#xff09;&#xff1a; 定義&#xff1a;并發是指多個任務共享資源&#xff0c;但是并不一定同時執行。它強…

pipe函數、SIGCHLD、execvp

pipe函數 以下是一個使用C語言編寫的通過管道&#xff08;pipe&#xff09;進行進程間通信的示例代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>int main() {int pipefd[2];pid_t pid;char b…

[⑧ADRV902x]: Digital Pre-Distortion (DPD)學習筆記

前言 DPD 數字預失真技術&#xff0c;是一種用于抑制功率放大器非線性失真的方法。 它通過在信號輸入功率放大器&#xff08;PA&#xff09;之前插入一個預失真模塊&#xff0c;對輸入信號進行適當的調制&#xff0c;以抵消功率放大器引起的非線性失真&#xff0c;使功率放大器…

Ubuntu 安裝 CUDA 和 cuDNN 詳細步驟

我的Linux系統背景&#xff1a; 系統和驅動都已安裝。 系統是centos 8。查看自己操作系統的版本信息&#xff1a;cat /etc/issue或者是 cat /etc/lsb-release 用nvidia-smi可以看到顯卡驅動和可支持的最高cuda版本&#xff0c;我的是12.2。驅動版本是535.129.03 首先&#…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-9閾值選取-機器視覺中應用正態分布和6-sigma

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-數學基礎Ch0-9閾值選取-機器視覺中應用正態分布和6-sigma 5M1E——造成產品質量波動的六因素 人 Man Manpower 機器 Machine 材料 Material 方法 Method 測量 Measurment 環境 Envrionment DMAI…

RESTful 服務的開發

目錄 1.RESTful風格介紹2.使用 RESTful 風格設計的用戶管理 Web API 的示例代碼13.RESTful 風格設計的用戶管理 Web API 的示例代碼2 1.RESTful風格介紹 RESTful&#xff08;Representational State Transfer&#xff09;是一種軟件架構風格&#xff0c;用于設計網絡應用程序的…

模塊電源(六):前饋電容

一、前饋電容&#xff1a; 前饋電容是與電阻分壓的頂部電阻 并聯的"可選電容器" 二、計算及仿真&#xff1a; 1、計算 無前饋電容時&#xff0c;輸出電壓&#xff1a;&#xff1b;有前饋電容時&#xff0c;輸出電壓&#xff1a;&#xff0c;(其中&#xff0c;&am…

Java工程找不到javax.xml.bind.annotation包

文章目錄 問題解決方法參考 問題 最近Java工程找不到javax.xml.bind.annotation包&#xff0c;進行了解決。 解決方法 參考 stackoverflow: package javax.xml.bind.annotation does not exist error javax.xml.bind這個庫從Java 11版本就被移除了&#xff0c;缺失了這個包…

crmeb本地開發配置代理

crmeb 是一個開源的商城系統&#xff0c; v5 版本是一個前后端分離的項目&#xff0c; 我們從git倉庫中下載下來的是一個文件夾&#xff0c;其結構是這樣的 我的系統沒有使用docker &#xff0c;使用的是 laragon 的系統 所以首先我們要在 nginx 中配置 之后&#xff0c; 我們…

WebStorm:Mac/Win上強大的JavaScript開發工具

WebStorm是JetBrains公司開發的針對Mac和Windows系統的JavaScript開發工具。它為開發者提供了一站式的代碼編輯、調試、測試和版本控制等功能&#xff0c;幫助你更高效地進行Web開發。新版本的WebStorm 2023在性能和用戶體驗方面都做出了重大改進&#xff0c;讓你的JavaScript開…

為什么感染HPV的人越來越多?勁松中西醫結合醫院專家發表看法

近年來&#xff0c;HPV感染率在我國呈現上升趨勢&#xff0c;引起了社會的廣泛關注。HPV是一種人乳頭瘤病毒&#xff0c;主要通過性接觸傳播&#xff0c;也是引起宮頸癌的主要原因之一。那么&#xff0c;為什么我國的HPV感染率如此高呢&#xff1f; 首先&#xff0c;我們需要了…

深度學習疲勞檢測 駕駛行為檢測 - python opencv cnn 計算機競賽

文章目錄 0 前言1 課題背景2 相關技術2.1 Dlib人臉識別庫2.2 疲勞檢測算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手機檢測3.4 抽煙檢測3.5 喝水檢測 4 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度學習加…

遠程服務器QEMU+Ubuntu+GRUB+VNC最佳實踐

遠程服務器QEMUUbuntuGRUBVNC最佳實踐 1. 準備2. QEMU啟動安裝Ubuntu2.1 服務器端2.2 本地端 3. 從服務器終端控制虛擬機GRUB與虛擬機終端 這段時間參與大量內核切換測試工作&#xff0c;實體機需要硬件自檢太過笨重&#xff0c;因此主要通過QEMU驗證正確性。有一個很大的問題是…