最終更新日時:
が更新

履歴 編集

function
<cwchar>

std::mbrlen

namespace std {
  size_t mbrlen(const char* s, size_t n, mbstate_t* ps);
}

概要

マルチバイト文字を構成するバイト数を、変換状態を保持しながら取得する。

sが指す位置から最大nバイトを調べ、1文字を構成するバイト数を返す。<cstdlib>mblen()と違って変換状態を引数として受け取るため、複数のスレッドから安全に使用できる。

戻り値

戻り値 意味
0 次のnバイト以内にヌル文字が現れた
正の値(n以下) 完全な1文字を構成するバイト数
(size_t)-1 不正なバイト列である。errnoEILSEQが設定される
(size_t)-2 次のnバイトは不完全だが、不正ではない文字の一部である

備考

  • psがヌルポインタの場合、処理系が用意した内部のオブジェクトが変換状態として使用される
  • 戻り値(size_t)-2となった場合、続きのバイト列を同じ変換状態とともに渡すことで、変換を再開できる

#include <iostream>
#include <clocale>
#include <cwchar>

int main()
{
  std::setlocale(LC_ALL, "C.UTF-8");

  std::mbstate_t state{};
  const char* s = "aあ";

  // 'a'は1バイト
  std::size_t n1 = std::mbrlen(s, 4, &state);
  std::cout << n1 << std::endl;

  // 'あ'はUTF-8では3バイト
  std::size_t n2 = std::mbrlen(s + n1, 4, &state);
  std::cout << n2 << std::endl;
}

出力例

1
3

ロケールの設定に対応していない環境では、異なる結果となる場合がある。

関連項目