名前空間
変種
操作

std::mbrtoc32

提供: cppreference.com
< cpp‎ | string‎ | multibyte
ヘッダ <cuchar> で定義
std::size_t mbrtoc32( char32_t* pc32,

                      const char* s,
                      std::size_t n,

                      std::mbstate_t* ps );
(C++11およびそれ以降)

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

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

*s 内のマルチバイト文字が複数の char32_t のシーケンスに対応する場合 (UTF-32 では有り得ません)、この関数の最初の呼び出し後、次の mbrtoc32 の呼び出しが *s を見ることなく追加の char32_t を書き出すように、 *ps が更新されます。

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

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

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

目次

[編集] 引数

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

[編集] 戻り値

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

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

[編集]

#include <iostream>
#include <iomanip>
#include <clocale>
#include <cstring>
#include <cwchar>
#include <cuchar>
#include <cassert>
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
 
    std::string str = u8"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 << 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 << +(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)
32ビットワイド文字をマルチバイト文字列に変換します
(関数) [edit]
[仮想]
ファイルから読み込む時などのために、文字列を externT から internT に変換します
(std::codecvtの仮想プロテクテッドメンバ関数) [edit]