名前空間
変種
操作

mbrtoc16

提供: cppreference.com
< c‎ | string‎ | multibyte
ヘッダ <uchar.h> で定義
size_t mbrtoc16( char16_t * restrict pc16, const char * restrict s,
                 size_t n, mbstate_t * restrict ps );
(C11以上)

ナローマルチバイト文字表現から単一のコードポイントを可変長16ビットワイド文字表現 (一般的には UTF-16) に変換します。

s がヌルポインタでなければ、次のマルチバイト文字 (あらゆるシフトシーケンスを含み、現在のマルチバイト変換状態 *ps を考慮に入れた) を完全にするために必要なバイト数を決定するために s の指すバイトから始まるマルチバイト文字列を最大 n バイト調べます。 s の次のマルチバイト文字が完全かつ有効であると決定できれば、それを対応する16ビット文字に変換し、 (pc16 がヌルでなければ) それを *pc16 に格納します。

*s 内のマルチバイト文字が複数の char16_t のシーケンスに対応する場合 (例えば UTF-16 のサロゲートペア)、この関数の最初の呼び出し後、次の mbrtoc16 の呼び出しが *s を見ることなく追加の char16_t を書き出すように、 *ps が更新されます。

s がヌルポインタの場合、 n および pc16 の値は無視され、その呼び出しは mbrtoc16(NULL, "", 1, ps) と同等になります。

生成されたワイド文字がヌル文字の場合、変換状態 *ps は初期シフト状態を表すようになります。

マクロ __STDC_UTF_16__ が定義されている場合、この関数が使用する16ビットエンコーディングは UTF-16 です。 そうでなければ、処理系定義です。 いずれの場合でも、この関数が使用するマルチバイト文字エンコーディングは、現在アクティブな C のロケールによって指定されます。

目次

[編集] 引数

pc16 - 結果の16ビットワイド文字が書き込まれる位置を指すポインタ
s - 入力として使用されるマルチバイト文字列を指すポインタ
n - 調べる s 内のバイト数の制限
ps - マルチバイト文字列を解釈するときに使用される変換状態オブジェクトを指すポインタ

[編集] 戻り値

以下のうちいずれか最初に適用されるものを返します。

  • s から変換された (そしてヌルでなければ *pc16 に格納された) 文字がヌル文字であった場合は 0
  • s からの変換に成功したマルチバイト文字列のバイト数 [1...n]
  • 複数の char16_t 文字 (サロゲートペアなど) から次の char16_t*pc16 に書き込まれた場合は (size_t)-3。 この場合、入力から処理されるバイトはありません。
  • 次の n バイトがそこまでの部分は有効だけれども不完全なマルチバイト文字を構成する場合は (size_t)-2*pc16 には何も書き込まれません。
  • エンコーディングエラーが発生した場合は (size_t)-1*pc16 には何も書き込まれず、値 EILSEQerrno に格納され、値 *ps は未規定になります。

[編集]

#include <stdio.h>
#include <locale.h>
#include <uchar.h>
 
mbstate_t state;
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    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 ", (unsigned char)in[n]);
    puts("]");
 
    char16_t out[in_sz];
    char *p_in = in, *end = in + in_sz;
    char16_t *p_out = out;
    size_t rc;
    while((rc = mbrtoc16(p_out, p_in, end - p_in, &state)))
    {
        if(rc == (size_t)-1)      // invalid input
            break;
        else if(rc == (size_t)-2) // truncated input
            break;
        else if(rc == (size_t)-3) // UTF-16 high surrogate
            p_out += 1;
        else {
            p_in += rc;
            p_out += 1;
        };
    }
 
    size_t out_sz = p_out - out + 1;
    printf("into %zu UTF-16 code 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 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ]

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.28.1.1 The mbrtoc16 function (p: 398-399)

[編集] 関連項目

16ビットワイド文字をマルチバイト文字列に変換します
(関数) [edit]