名前空間
変種
操作

mbrtoc16

From 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 以降)

1バイトのマルチバイト文字表現から、可変長16ビットワイド文字表現(通常はUTF-16)へ1つのコードポイントを変換します。

もし s がヌルポインタでない場合、マルチバイト文字文字列の最大 n バイトを検査します。これは s が指すバイトから開始し、次のマルチバイト文字を完了するために必要なバイト数(シフトシーケンスを含む、現在のマルチバイト変換状態 *ps を考慮)を決定します。関数が s 内の次のマルチバイト文字が完全で有効であると判断した場合、それを対応する16ビットワイド文字に変換し、 *pc16pc16 がヌルでない場合)に格納します。

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

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

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

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

目次

[編集] パラメータ

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

[編集] 戻り値

以下が適用される場合、最初のもの

  • 0 s から変換され(非ヌルの場合は *pc16 に格納された)、ヌル文字だった場合。
  • マルチバイト文字から正常に変換されたバイト数 [1n]
  • (size_t)-3 マルチ char16_t 文字(例:サロゲートペア)から次の char16_t*pc16 に書き出された場合。この場合、入力からバイトは処理されません。
  • (size_t)-2 次の n バイトが、不完全であるが、これまでのところ有効なマルチバイト文字を構成する場合。 *pc16 には何も書き込まれません。
  • (size_t)-1 エンコーディングエラーが発生した場合。 *pc16 には何も書き込まれず、値 EILSEQerrno に格納され、 *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 The mbrtoc16 function (p: 408-409)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.28.1.1 The mbrtoc16 function (p: 398-399)

[編集] 関連項目

UTF-16文字をナローマルチバイトエンコーディングに変換する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)