首页
/
每日頭條
/
科技
/
c語言中長字符串用什麼定義
c語言中長字符串用什麼定義
更新时间:2025-12-08 20:37:58

c語言中長字符串用什麼定義?目前互聯網應用中,例如大部分網站都已經使用 UTF-8 編碼,而 C 标準庫裡面,例如filesystem庫裡面關于文件路徑等,也是和 UTF-8 編碼相關,因此 C 标準也要優化對 UTF-8 編碼的支持,下面我們就來說一說關于c語言中長字符串用什麼定義?我們一起去了解并探讨一下這個問題吧!

c語言中長字符串用什麼定義(C20新特性)1

c語言中長字符串用什麼定義

新增 char8_t 類型表示 UTF-8 字符串

目前互聯網應用中,例如大部分網站都已經使用 UTF-8 編碼,而 C 标準庫裡面,例如filesystem庫裡面關于文件路徑等,也是和 UTF-8 編碼相關,因此 C 标準也要優化對 UTF-8 編碼的支持。

雖然在 C 11 中,已經增加了 UTF-8 字符串常量(u8"\xe4\xb8\xad\xe6\x96\x87"),但一直是使用 char * 作為類型。這樣導緻的問題,就是一個 char * 類型變量,可能是 UTF-8 編碼,也可能是多字節編碼(例如 GBK),因此為了區分不同的編碼類型,可能需要通過不同的函數名重載,或者模闆 traits 等技巧來進行區分。

因此在 C 20 中,将 UTF-8 字符串作為一種單獨的類型,增加了新的 char8_t 類型來進行描述。各種與字符串相關的模闆都增加 char8_t 相關的特化,例如 std 的字符串包裝類,就增加了 std::u8string 類型(std::basic_string<char8_t>)。

這個修改會造成不兼容,原來合法的代碼,可能會變得不合法,原來為了處理 UTF-8 字符串而特化成 char * 類型的模闆,需要改為特化 char8_t * 類型。

const auto * s1 = u8"text"; // <1> s1的類型,C 17 推導成const char *,C 20 推導成const char8_t * const char * s2 = u8"text"; // <2> C 17 正确,C 20 變成不正确 const char8_t * s3 = u8"text"; // <3> C 17 不正确(沒有char8_t類型),C 20 正确 template<typename T> int is_char8( const T * ) { return 0; } template<> int is_char8<char>( const char * ) { return 1; } std::cout << is_char8( s3 ) << std::endl; // <4> C 17 輸出1,C 20 輸出0 template<typename T> int is_char8_new( const T * ) { return 0; } template<> int is_char8_new<char8_t>( const char8_t * ) { return 1; } // <5> C 17 不支持 std::cout << is_char8_new( s3 ) << std::endl; // <6> C 20 輸出1 std::string s4 = u8"text"; // <7> C 17 正确,C 20 變成不正确 std::u8string s5 = u8"text"; // <8> C 17 不正确(沒有std::u8string類型),C 20 正确 std::filesystem::path p1; std::string s6 = p1.u8string(); // <9> C 17 正确,C 20 變成不正确 std::u8string s7 = p1.u8string(); // <10> C 17 不正确(沒有std::u8string類型),C 20 正确

明确 char16_t 和 char32_t 表示 UTF-16 和 UTF-32 字符串

之前的 C 标準新增 char16_t 和 char32_t 類型的時候,隻是說他們應該使用 UTF-16 和 UTF-32 的編碼格式,但标準裡面沒有明确進行這樣要求。

因此在 C 20 中,新增的 char8_t 類型明确要求是 UTF-8 字符串,同時将原來的 char16_t 和 char32_t 類型,也改為明确要求是 UTF-16 和 UTF-32 字符串。

明确不在 ISO 10646(Unicode編碼标準)中的字符的處理

之前的 C 标準,新增了字符串常量中的Unicode字符表達方式(\unnnn和\Unnnnnnnn),例如 \U0001f34 、 \uD83C\uDF4C 等,但對于不在 ISO 10646(Unicode編碼标準)中的字符的處理,則沒有明确說明。

因此在 C 20 中,明确要求Unicode字符表達方式(\unnnn和\Unnnnnnnn)中,如果有不在ISO 10646(Unicode編碼标準)中的字符,那麼這個代碼是不合法的。

【往期回顧】

C 20 新特性(9):指針和數組相關的兩個改進

C 20 新特性(8):range形式的for語句改進

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
饑荒口袋版最舊版
饑荒口袋版最舊版
序言早在2013年,冒險生存類遊戲《饑荒》已在PC上平台登錄,并憑借着極其特色的畫面及出色的遊戲性獲得玩家的一緻好評。而現在,該作以移植版模式現身IPAD平台,也即是意味在玩家将可以在移動平台上演繹求生的瘋狂。該作究竟表現如何,讓我們一起進...
2025-12-08
推薦一個适合學生用的平闆電腦
推薦一個适合學生用的平闆電腦
随着手機和電腦行業的不斷發展,手機的屏幕越來越大、性能和續航也越來越強,而電腦也向更輕薄、更易于攜帶進化着,于是平闆電腦就出現了。平闆電腦兼顧有手機的便利性以及高簡約設計,又具有電腦所配備的性能以及相應功能,十分适合辦公人員以及學生使用。不...
2025-12-08
手機屏幕修得好如何好評
手機屏幕修得好如何好評
小編又要來裝個逼,說說上次我文章講到的手機屏幕,很多人有這情況,手機屏幕摔壞了就去修或者換手機了,可大家知道師傅賣你的手機屏幕就一定是原廠原裝的嗎?(官方售後請無視)。舉個栗子,我們先上淘寶看看米5的手機屏幕第二種是流動在個手機維修店和淘寶...
2025-12-08
蘋果電腦怎樣複制粘貼
蘋果電腦怎樣複制粘貼
對于很多使用Mac的用戶,尤其是剛從Windows電腦轉換到Mac電腦上的用戶來說,常常會遇到有關“複制”的問題。比如很多用戶經常詢問的“蘋果電腦怎麼複制?”“Mac複制粘貼怎麼使用”“Mac怎麼複制到移動硬盤?”等等。閱讀本篇文章,赤友軟...
2025-12-08
顯卡丐版和頂級性能區别
顯卡丐版和頂級性能區别
最近英偉達20系顯卡價格真的是非常的貴,全系漲價,性能提升多少給你漲價多少,甚至RTX2080TI提升30多恨不得漲價100%,英偉達的吃相真的難看了點,但是沒辦法啊,在獨顯市場尤其是高端,英偉達就是為所欲為,價格高,你也沒辦法,因為AMD...
2025-12-08
Copyright 2023-2025 - www.tftnews.com All Rights Reserved