最終更新日時:
が更新

履歴 編集

function
<cstdlib>

std::wcstombs

namespace std {
  size_t wcstombs(char* s, const wchar_t* pwcs, size_t n);
}

概要

ワイド文字列を、マルチバイト文字列へ変換する。

pwcsが指す文字列を初期変換状態から順に変換し、sが指す配列へ最大nバイトを書き込む。終端のヌル文字に達した場合は、それも書き込まれる。

この関数は現在のロケールカテゴリLC_CTYPEに依存してマルチバイト文字を解釈する。

内部状態に依存するエンコーディングを考慮するならば、特に理由がない限り、この関数ではなくstd::mbstate_tを受け取るstd::wcsrtombs()を新しいコードでは用いるべきである。

戻り値

  • 変換できた場合、書き込んだバイト数(終端のヌル文字を含まない)を返す
  • 変換できないワイド文字があった場合、(size_t)-1を返す

戻り値nと等しい場合、終端のヌル文字は書き込まれていない。

備考

  • sがヌルポインタの場合、書き込みは行われず、変換に必要なバイト数だけが返る。この性質を利用して、必要なバッファサイズを事前に求められる
  • 1文字の変換がnバイトに収まらない場合、その文字の途中までが書き込まれることはなく、書き込みはその手前で終了する

#include <clocale>
#include <cstdlib>
#include <iostream>

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

  const wchar_t* ws = L"abc";

  // 必要なバイト数を先に求める
  std::size_t len = std::wcstombs(nullptr, ws, 0);
  std::cout << len << std::endl;

  char buffer[8] = {};
  std::size_t n = std::wcstombs(buffer, ws, 8);
  std::cout << n << ' ' << buffer << std::endl;
}

出力例

3
3 abc

バージョン

言語

  • C++98

関連項目