?
This document uses PHP Chinese website manual Release
在頭文件<uchar.h>中定義 | ||
---|---|---|
size_t c16rtomb(char * s,char16_t c16,mbstate_t * ps); | (自C11以來) |
將單個代碼點(diǎn)從其可變長度的16位寬字符表示(通常為UTF-16)轉(zhuǎn)換為其窄多字節(jié)字符表示形式。
如果s不是空指針并且c16是代碼點(diǎn)的有效可變長度編碼中的最后16位代碼單元,則該函數(shù)確定存儲該代碼點(diǎn)的多字節(jié)字符表示所需的字節(jié)數(shù)(包括任何 移位序列),并將多字節(jié)字符表示存儲在第一個元素由s指向的字符數(shù)組中。 該函數(shù)最多可以寫入MB_CUR_MAX個字節(jié)。
如果s是空指針,那么對于某些內(nèi)部緩沖區(qū)buf,調(diào)用等同于c16rtomb(buf,u'\ 0',ps)。
如果c16是空寬字符u'\ 0',則存儲空字節(jié),之前是恢復(fù)初始轉(zhuǎn)換狀態(tài)所需的任何轉(zhuǎn)換序列,并且轉(zhuǎn)換狀態(tài)參數(shù)* ps被更新以表示初始轉(zhuǎn)換狀態(tài)。
如果c16不是寬字符的16位表示形式的最終代碼單元,則它不會寫入由s指向的數(shù)組,只會更新* ps。
如果定義了宏__STDC_UTF_16__,則該函數(shù)使用的16位編碼為UTF-16; 否則,它是實(shí)現(xiàn)定義的。 在任何情況下,此函數(shù)使用的多字節(jié)字符編碼均由當(dāng)前活動的C語言環(huán)境指定。
s | - | 指向多字節(jié)字符將被存儲在其中的窄字符數(shù)組的指針 |
---|---|---|
C16 | - | 要轉(zhuǎn)換的16位寬字符 |
PS | - | 指向解釋多字節(jié)字符串時使用的轉(zhuǎn)換狀態(tài)對象的指針 |
成功時,返回寫入字符數(shù)組的第一個元素由s指向的字節(jié)數(shù)(包括任何移位序列)。 這個值可能是?0 ?,例如 當(dāng)處理多char16_t單元序列中的前導(dǎo)char16_t單元時(發(fā)生在處理UTF-16的代理對中的前導(dǎo)代理時)。
失敗時(如果c16不是有效的16位代碼單元)則返回-1,將EILSEQ存儲在errno中,并使* ps處于未指定狀態(tài)。
在發(fā)布的C11中,與將可變寬度多字節(jié)(如UTF-8)轉(zhuǎn)換為可變寬度16位(如UTF-16)編碼的mbrtoc16不同,此函數(shù)只能轉(zhuǎn)換單個單元的16位編碼, 這意味著它不能將UTF-16轉(zhuǎn)換為UTF-8,盡管這是該功能的最初意圖。 C11之后的缺陷報(bào)告DR488糾正了這一問題。
注意:此示例假定應(yīng)用了缺陷報(bào)告488的修復(fù)。
#include <stdio.h>#include <locale.h>#include <uchar.h>#include <stdlib.h> mbstate_t state;int main(void){ setlocale(LC_ALL, "en_US.utf8"); char16_t in[] = u"z?水?"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-16 code units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", in[n]); puts("]"); char out[MB_CUR_MAX * in_sz]; char *p = out; for(size_t n = 0; n < in_sz; ++n) { int rc = c16rtomb(p, in[n], &state); if(rc == -1) break; p += rc; } size_t out_sz = p - out; printf("into %zu UTF-8 code units: [ ", out_sz); for(size_t x = 0; x < out_sz; ++x) printf("%#x ", +(unsigned char)out[x]); puts("]");}
輸出:
Processing 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ]into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.28.1.2 c16rtomb功能(p:399-400)
mbrtoc16(C11) | 從一個窄多字節(jié)字符串(函數(shù))生成下一個16位寬字符 |
---|
| c16rtomb的C ++文檔 |