Namespaces
Variants

std:: mbrtoc32

From cppreference.net
定義済みヘッダー <cuchar>
std:: size_t mbrtoc32 ( char32_t * pc32,

const char * s,
std:: size_t n,

std:: mbstate_t * ps ) ;
(C++11以降)

ナローマルチバイト文字をUTF-32文字表現に変換します。

s が null ポインタでない場合、 s が指すバイトから始まるマルチバイト文字列の最大 n バイトを検査し、次のマルチバイト文字(シフトシーケンスを含む)を完了するために必要なバイト数を決定します。関数が s 内の次のマルチバイト文字が完全かつ有効であると判断した場合、対応する32ビット文字に変換し、 * pc32 に格納します( pc32 が null でない場合)。

マルチバイト文字が * s 内に存在し、それが複数のchar32_tシーケンスに対応する場合(UTF-32では不可能)、この関数の最初の呼び出し後、 * ps は更新され、以降の mbrtoc32 の呼び出しでは追加の char32_t を書き出し、 * s を考慮しなくなります。

s がヌルポインタの場合、 n および pc32 の値は無視され、この呼び出しは std :: mbrtoc32 ( nullptr, "" , 1 , ps ) と等価になります。

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

この関数で使用されるマルチバイトエンコーディングは、現在アクティブなCロケールによって指定されます。

目次

翻訳内容: - 「Contents」→「目次」 - C++関連の専門用語(Parameters, Return value, Examples, See also)は原文のまま保持 - HTMLタグ、属性、構造は完全に保持 - 番号部分は変更なし

パラメータ

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

戻り値

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

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

#include <cassert>
#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::string str = "z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
    std::cout << "Processing " << str.size() << " bytes: [ " << std::showbase;
    for (unsigned char c : str)
        std::cout << std::hex << +c << ' ';
    std::cout << "]\n";
    std::mbstate_t state{}; // zero-initialized to initial state
    char32_t c32;
    const char* ptr = str.c_str(), *end = str.c_str() + str.size() + 1;
    while (std::size_t rc = std::mbrtoc32(&c32, ptr, end - ptr, &state))
    {
        std::cout << "Next UTF-32 char: " << std::hex
                  << static_cast<int>(c32) << " obtained from ";
        assert(rc != (std::size_t) - 3); // no surrogates in UTF-32
        if (rc == (std::size_t) - 1)
            break;
        if (rc == (std::size_t) - 2)
            break;
        std::cout << std::dec << rc << " bytes [ ";
        for (std::size_t n = 0; n < rc; ++n)
            std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';
        std::cout << "]\n";
        ptr += rc;
    }
}

出力:

Processing 10 bytes: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ]
Next UTF-32 char: 0x7a obtained from 1 bytes [ 0x7a ]
Next UTF-32 char: 0xdf obtained from 2 bytes [ 0xc3 0x9f ]
Next UTF-32 char: 0x6c34 obtained from 3 bytes [ 0xe6 0xb0 0xb4 ]
Next UTF-32 char: 0x1f34c obtained from 4 bytes [ 0xf0 0x9f 0x8d 0x8c ]

関連項目

(C++11)
UTF-32文字をナローマルチバイトエンコーディングに変換する
(関数)
[virtual]
ExternT から InternT への文字列変換(ファイルからの読み取り時など)
( std::codecvt<InternT,ExternT,StateT> の仮想保護メンバ関数)