- cstdlib[meta header]
- std[meta namespace]
- function[meta id-type]
namespace std {
int mbtowc(wchar_t* pwc, const char* s, size_t n);
}- size_t[link /reference/cstddef/size_t.md]
マルチバイト文字を、ワイド文字へ変換する。
sが指す位置から最大nバイトを読み込んで1文字分のマルチバイト文字を解析し、対応するワイド文字をpwcが指す位置へ格納する。pwcがヌルポインタの場合、変換は行われるが結果は格納されない。
この関数は現在のロケールカテゴリLC_CTYPEに依存してマルチバイト文字を解釈する。
内部状態に依存するエンコーディングを考慮するならば、特に理由がない限り、この関数ではなくstd::mbstate_tを受け取るstd::mbrtowc()を新しいコードでは用いるべきである。
sがヌルポインタの場合、内部状態を初期化する。現在のエンコーディングが状態を持つ場合は非ゼロの値を返し、それ以外の場合は0を返すsが指す位置がヌル文字である場合、0を返す- 正常に変換できた場合、変換に使用したバイト数(
n以下の正の値)を返す - 不正なバイト列である場合、または
nバイト以内に文字が完結しない場合、-1を返す
- この関数は静的記憶域の内部状態を保持するため、スレッドセーフではない
- C++17以降(C11以降)では、
sがヌルポインタでない呼び出しは、初期変換状態から解析を開始したかのように振る舞うと規定されており、内部状態に依存するエンコーディングを扱えない
- C++17以降(C11以降)では、
- 変換結果を格納する
pwcは、1文字分のワイド文字を格納できなければならない
#include <clocale>
#include <cstdlib>
#include <cstring>
#include <iostream>
int main()
{
std::setlocale(LC_ALL, "C.UTF-8");
const char* s = "あ";
wchar_t wc = 0;
// UTF-8では3バイトを消費して1文字へ変換される
int n = std::mbtowc(&wc, s, std::strlen(s));
std::cout << n << std::endl;
std::cout << (wc == L'あ') << std::endl;
}- std::mbtowc[color ff0000]
- LC_ALL[link /reference/clocale/lc_all.md]
- std::setlocale[link /reference/clocale/setlocale.md]
3
1
- C++98
mblen: バイト数だけを取得するwctomb: 逆方向の変換mbstowcs: 文字列全体を変換するstd::mbrtowc():std::mbstate_tを受け取るスレッドセーフなバージョン