名前空間
変種
操作

std::mbrtoc16

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

                      const char* s,
                      std::size_t n,

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

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

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

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

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

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

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

目次

[編集] 引数

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

[編集] 戻り値

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

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

[編集]

#include <iostream>
#include <iomanip>
#include <clocale>
#include <cstring>
#include <cwchar>
#include <cuchar>
 
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
    char16_t c16;
    const char *ptr = &str[0], *end = &str[0] + str.size();
 
    while(std::size_t rc = std::mbrtoc16(&c16, ptr, end - ptr + 1, &state))
    {
        std::cout << "Next UTF-16 char: " << std::hex << c16 << " obtained from ";
        if(rc == (std::size_t)-3)
            std::cout << "earlier surrogate pair\n";
        else if(rc == (std::size_t)-2)
            break;
        else if(rc == (std::size_t)-1)
            break;
        else {
            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-16 char: 0x7a obtained from 1 bytes [ 0x7a ]
Next UTF-16 char: 0xdf obtained from 2 bytes [ 0xc3 0x9f ]
Next UTF-16 char: 0x6c34 obtained from 3 bytes [ 0xe6 0xb0 0xb4 ]
Next UTF-16 char: 0xd83c obtained from 4 bytes [ 0xf0 0x9f 0x8d 0x8c ]
Next UTF-16 char: 0xdf4c obtained from earlier surrogate pair

[編集] 関連項目

(C++11)
16ビットワイド文字をマルチバイト文字列に変換します
(関数) [edit]
[仮想]
ファイルから読み込む時などのために、文字列を externT から internT に変換します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数) [edit]