Namespaces
Variants

mbrtoc16

From cppreference.net
ヘッダーで定義 <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 が null ポインタでない場合、最大 n バイトのマルチバイト文字列を検査し、 s が指すバイトから始めて、次のマルチバイト文字を完了するために必要なバイト数(シフトシーケンスを含み、現在のマルチバイト変換状態 * ps を考慮に入れて)を決定します。関数が s 内の次のマルチバイト文字が完全かつ有効であると判断した場合、それを対応する16ビットワイド文字に変換し、 * pc16 に格納します( pc16 が null でない場合)。

マルチバイト文字が * s 内に存在し、それが複数の char16_t シーケンス(例:UTF-16におけるサロゲートペア)に対応する場合、この関数の最初の呼び出し後、 * ps は更新され、次回の mbrtoc16 呼び出し時に追加の char16_t を書き出すようになります。この際、 * s は考慮されません。

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

生成されたワイド文字がナル文字である場合、変換状態 * ps は初期シフト状態を表します。

マクロ __STDC_UTF_16__ が定義されている場合、この関数で使用される16ビットエンコーディングはUTF-16である。そうでない場合、そのエンコーディングは実装定義である。 このマクロは常に定義されており、エンコーディングは常にUTF-16である。 (C23以降) いずれの場合でも、この関数で使用されるマルチバイト文字エンコーディングは、現在有効なCロケールによって指定される。

目次

パラメータ

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

戻り値

以下のうち最初に該当するもの:

  • 0 sから変換された文字(かつnullでない場合 * pc16 に格納された)がナル文字であった場合。
  • バイト数 [ 1 , n ] sから正常に変換されたマルチバイト文字の。
  • ( size_t ) - 3 マルチ char16_t 文字(例:サロゲートペア)からの次の char16_t * pc16 に書き込まれた場合。この場合、入力からはバイトが処理されない。
  • ( size_t ) - 2 次の n バイトが不完全ではあるが、これまで有効なマルチバイト文字を構成する場合。 * pc16 には何も書き込まれない。
  • ( size_t ) - 1 エンコーディングエラーが発生した場合。 * pc16 には何も書き込まれず、値 EILSEQ errno に格納され、 * ps の値は未規定となる。

MSVCでは、UTF_8が正しく動作するために /utf-8 コンパイラフラグが必要な場合があります。

#include <locale.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    enum { in_sz = sizeof in / sizeof *in };
    printf("Processing %d UTF-8 code units: [", in_sz);
    for (int n = 0; n < in_sz; ++n)
        printf("%s%02X", n ? " " : "", (unsigned char)in[n]);
    puts("]");
    char16_t out[in_sz];
    const char* p_in = in;
    const char* end = in + in_sz;
    char16_t* p_out = out;
    mbstate_t state = {0};
    for (size_t rc; (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;
        };
    }
    const 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("%s%04X", x ? " " : "", out[x]);
    puts("]");
}

出力:

Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
into 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.30.1.3 mbrtoc16関数 (p: 408-409)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.28.1.1 mbrtoc16関数 (p: 398-399)

関連項目

UTF-16文字をナローマルチバイトエンコーディングに変換する
(関数)
C++ documentation for mbrtoc16