std::wcrtomb
From cppreference.com
| ヘッダ <cwchar> で定義 |
||
| std::size_t wcrtomb( char* s, wchar_t wc, std::mbstate_t* ps ); |
||
ワイド文字をそのナローマルチバイト表現に変換します。
もし s がヌルポインタでない場合、この関数は wc のマルチバイト文字表現を格納するのに必要なバイト数(シフトシーケンスを含み、現在のマルチバイト変換状態 *ps を考慮に入れる)を決定し、s によって指される文字配列にマルチバイト文字表現を格納し、必要に応じて *ps を更新します。この関数によって書き込まれるバイト数は最大 MB_CUR_MAX バイトです。
もし s がヌルポインタである場合、呼び出しは、ある内部バッファ buf に対して std::wcrtomb(buf, L'\0', ps) と同等になります。
もし wc がヌルワイド文字 L'\0' であれば、ヌルバイトが格納され、その前に初期シフト状態を復元するために必要なシフトシーケンスが置かれます。そして、変換状態パラメータ *ps は初期シフト状態を表すように更新されます。
目次 |
[編集] パラメータ
| s | - | マルチバイト文字が格納される狭い文字配列へのポインタ |
| wc | - | 変換するワイド文字 |
| ps | - | マルチバイト文字列を解釈する際に使用される変換状態オブジェクトへのポインタ |
[編集] 戻り値
成功した場合、s によって指される文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返します。
失敗した場合(wc が有効なワイド文字でない場合)、static_cast<std::size_t>(-1) を返し、EILSEQ を errno に格納し、*ps を未指定の状態のままにします。
[編集] 例
このコードを実行
#include <clocale> #include <cwchar> #include <iostream> #include <string> void print_wide(const std::wstring& wstr) { std::mbstate_t state{}; for (wchar_t wc : wstr) { std::string mb(MB_CUR_MAX, '\0'); std::size_t ret = std::wcrtomb(&mb[0], wc, &state); std::cout << "multibyte char " << mb << " is " << ret << " bytes\n"; } } int main() { std::setlocale(LC_ALL, "en_US.utf8"); std::wstring wstr = L"z\u00df\u6c34\U0001f34c"; // or L"zß水🍌" print_wide(wstr); }
出力
multibyte char z is 1 bytes multibyte char ß is 2 bytes multibyte char 水 is 3 bytes multibyte char 🍌 is 4 bytes
[編集] 関連
| ワイド文字をそのマルチバイト表現に変換する (関数) | |
| 与えられた状態で、次のマルチバイト文字をワイド文字に変換する (関数) | |
| [virtual] |
ファイルへの書き込み時など、InternT から ExternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| Cドキュメント (wcrtomb について)
| |