std::mbtowc
From cppreference.com
| ヘッダ <cstdlib> で定義 |
||
| int mbtowc( wchar_t* pwc, const char* s, std::size_t n ); |
||
sが指すマルチバイト文字をワイド文字に変換します。変換されたワイド文字は、*pwcがヌルポインタでない場合に*pwcに書き込まれます。
s がヌルポインタの場合、グローバル変換状態をリセットし、シフトシーケンスが使用されているかどうかを判断します。
目次 |
[編集] パラメータ
| s | - | マルチバイト文字へのポインタ |
| n | - | 検査できるs内のバイト数の制限 |
| pwc | - | 出力用のワイド文字へのポインタ |
[編集] 戻り値
sがヌルポインタでない場合、マルチバイト文字に含まれるバイト数を返します。sが指す最初のバイトが有効なマルチバイト文字を形成しない場合は-1を、sがヌル文字'\0'を指している場合は0を返します。
s がヌルポインタの場合、初期シフト状態を表すように内部変換状態をリセットし、現在のマルチバイトエンコーディングが状態依存でない(シフトシーケンスを使用しない)場合は 0 を、状態依存である(シフトシーケンスを使用する)場合はゼロ以外の値を返します。
[編集] 注記
mbtowcの各呼び出しは、内部グローバル変換状態(この関数のみが知るstd::mbstate_t型の静的オブジェクト)を更新します。マルチバイトエンコーディングがシフト状態を使用する場合、後方参照や複数回のスキャンを避けるために注意が必要です。いずれの場合も、複数のスレッドは同期なしでmbtowcを呼び出すべきではありません。代わりにstd::mbrtowcを使用できます。
[編集] 例
このコードを実行
#include <clocale> #include <cstdlib> #include <cstring> #include <iostream> int print_mb(const char* ptr) { std::mbtowc(nullptr, 0, 0); // reset the conversion state const char* end = ptr + std::strlen(ptr); int ret{}; for (wchar_t wc; (ret = std::mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret) std::wcout << wc; std::wcout << '\n'; return ret; } int main() { std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding const char* str = "z\u00df\u6c34\U0001d10b"; // or "zß水𝄋" // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; print_mb(str); }
出力
zß水𝄋
[編集] 関連項目
| 与えられた状態で、次のマルチバイト文字をワイド文字に変換する (関数) | |
| 次のマルチバイト文字のバイト数を返す (関数) | |
| [virtual] |
ファイルからの読み込み時など、ExternT から InternT への文字列を変換します。( std::codecvt<InternT,ExternT,StateT> の virtual protected メンバ関数) |
| mbtowc の C ドキュメント
| |