\x/\u/\u字符引用可以與所有字符串類型自由組合嗎?
沒有。\x
可以用于任何事情,但是\u
和\U
只能在特定UTF編碼的字符串中使用。但是,對于任何UTF編碼的字符串,\u
和\U
你認(rèn)為合適就可以使用。
是否所有字符串類型都是固定寬度的,即數(shù)組包含的元素與文字中所顯示的一樣多,還是將\x/\u/\u引用展開成一個可變的字節(jié)數(shù)?
不是你的意思。\x
, \u
,和\U
基于字符串編碼進行轉(zhuǎn)換。這些“代碼單位”的數(shù)量(使用Unicode術(shù)語)。一個char16_t
是一個UTF-16代碼單元)值取決于包含字符串的編碼。文字u8"\u1024"
將創(chuàng)建包含2的字符串。char
S加上空終止符。文字u"\u1024"
將創(chuàng)建包含1的字符串。char16_t
加上一個空終止符。
使用的代碼單元數(shù)基于Unicode編碼。
u“和U8”字符串是否具有編碼語義,例如,是否可以說char16tx[]=u“\u0010FFFF”,而非BMP編碼點被編碼成兩個單元的UTF 16序列?
u""
創(chuàng)建一個UTF-16編碼字符串。u8""
創(chuàng)建一個UTF-8編碼字符串。它們將按照Unicode規(guī)范進行編碼。
在(1)中,我可以用\u寫單獨的代孕詞嗎?
絕對不是。該規(guī)范明確禁止使用utf-16代理項對(0xD8000xDFff)作為代碼點。\u
或\U
.
最后,是否有任何編碼字符串函數(shù)(即它們是字符感知的,并且可以檢測無效的字節(jié)序列)?
絕對不是。好吧,請允許我換個說法。
std::basic_string
不處理Unicode編碼。他們當(dāng)然可以商店被編碼的字符串。但他們只能把它們看作是char
, char16_t
,或char32_t
他們不能把它們看作是用特定機制編碼的Unicode碼點序列。basic_string::length()
將返回代碼單位的數(shù)量,而不是代碼點。顯然,C標(biāo)準(zhǔn)庫字符串函數(shù)是完全無用的。
但是,應(yīng)該注意的是,Unicode字符串的“長度”并不意味著代碼點的數(shù)量。一些代碼點正在組合“字符”(一個不幸的名稱),這與以前的代碼點結(jié)合在一起。因此,多個編碼點可以映射到單個視覺字符。
實際上,IoStreams可以讀寫Unicode編碼的值。要做到這一點,您必須使用區(qū)域設(shè)置來指定編碼,并將其正確地注入到不同的位置。這說起來容易做起來難,而且我沒有任何代碼向你展示如何做到這一點。