mbrtowc
提供: cppreference.com
ヘッダ <wchar.h> で定義 | ||
(C95以上) | ||
(C99以上) | ||
ナローマルチバイト文字をワイド文字表現に変換します。
s
がヌルポインタでなければ、次の完全なマルチバイト文字 (あらゆるシフトシーケンスを含み、現在のマルチバイト変換状態 *ps を考慮した) を構成するために必要なバイト数を決定するために s
の指すバイトから始まるマルチバイト文字列を最大 n
バイト調べます。 s
内の次のマルチバイト文字が完全かつ有効であると決定した場合は、それを対応するワイド文字に変換し、 (pwc
がヌルでなければ) それを *pwc に格納します。
s
がヌルポインタであれば、 n
および pwc
の値は無視され、その呼び出しは mbrtowc(NULL, "", 1, ps) と同等です。
生成されたワイド文字がヌルポインタであれば、 *ps に格納されている変換状態は初期シフト状態になります。
環境マクロ __STDC_ISO_10646__ が定義されている場合、 wchar_t 型の値は Unicode の要求される集合 (一般的には UTF-32 エンコーディング) の文字の短い識別子と同じです。 そうでなければ、処理系定義です。 いずれの場合でも、この関数の使用するマルチバイト文字エンコーディングは現在アクティブな C のロケールによって指定されます。
目次 |
[編集]引数
pwc | - | 結果のワイド文字が書き込まれる位置を指すポインタ |
s | - | 入力として使用されるマルチバイト文字列を指すポインタ |
n | - | 調べる s のバイト数の制限 |
ps | - | マルチバイト文字列を解釈するときに使用される変換状態を指すポインタ |
[編集]戻り値
以下のうち最初に適用されるものが返されます。
s
から変換された (そしてヌルでなければ pwc に格納された) 文字がヌル文字であった場合は 0。s
からの変換に成功したマルチバイト文字のバイト数 [1...n]。- 次の
n
バイトが不完全だけれどもそこまでの部分は有効なマルチバイト文字の場合は (size_t)-2。 *pwc には何も書き込まれません。 - エンコーディングエラーが発生した場合は (size_t)-1。
*pwc
には何も書き込まれず、値 EILSEQ が errno に格納され、 *ps の値は未規定になります。
[編集]例
Run this code
#include <stdio.h>#include <locale.h>#include <string.h>#include <wchar.h> int main(void){setlocale(LC_ALL, "en_US.utf8");mbstate_t state;memset(&state, 0, sizeof state);char in[]= u8"z\u00df\u6c34\U0001F34C";// or u8"zß水🍌"size_t in_sz =sizeof in /sizeof*in; printf("Processing %zu UTF-8 code units: [ ", in_sz);for(size_t n =0; n < in_sz;++n)printf("%#x ", (unsignedchar)in[n]);puts("]"); wchar_t out[in_sz];char*p_in = in, *end = in + in_sz;wchar_t*p_out = out;int rc;while((rc = mbrtowc(p_out, p_in, end - p_in, &state))>0){ p_in += rc; p_out +=1;} size_t out_sz = p_out - out +1;printf("into %zu wchar_t units: [ ", out_sz);for(size_t x =0; x < out_sz;++x)printf("%#x ", out[x]);puts("]");}
出力:
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ] into 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]