名前空間
変種
操作

std::mbtowc

提供: cppreference.com
< cpp‎ | string‎ | multibyte
ヘッダ <cstdlib> で定義
int mbtowc( wchar_t* pwc, const char* s, std::size_t n );

s によって最初のバイトが指されているマルチバイト文字をワイド文字に変換し、 pwc がヌルでなければ *pwc に書き込みます。

s がヌルポインタの場合は、グローバルな変換状態をリセットし、シフトシーケンスが使用されるかどうかを調べます。

目次

[編集] 引数

s - マルチバイト文字を指すポインタ
n - 調べることができる s 内のバイト数の制限
pwc - 出力用のワイド文字を指すポインタ

[編集] 戻り値

s がヌルポインタでなければ、そのマルチバイト文字に含まれるバイト数を返します。 s の指す最初のバイト列が有効なマルチバイト文字を形成しない場合は -1s がヌル文字 '\0' を指す場合は 0 を返します。

s がヌルポインタであれば、内部の変換状態を初期シフト状態を表すようにリセットし、現在のマルチバイトエンコーディングが状態依存でない (シフトシーケンスを使用しない) 場合は 0、現在のマルチバイトエンコーディングが状態依存 (シフトシーケンスを使用する) の場合は非ゼロの値を返します。

[編集] ノート

mbtowc を呼ぶたびに、内部のグローバルな変換状態 (この関数のみが使用する std::mbstate_t 型の静的オブジェクト) を更新します。 マルチバイトエンコーディングがシフト状態を使用する場合、バックトラッキングや複数回のスキャンを避けるように注意しなければなりません。 いずれの場合でも、複数のスレッドが同期せずに mbtowc を呼ぶべきではありません。 代わりに std::mbrtowc を使用することができます。

[編集]

#include <iostream>
#include <clocale>
#include <cstring>
#include <cstdlib>
 
int print_mb(const char* ptr)
{
    std::mbtowc(NULL, 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 = u8"z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋"
                      // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

出力:

zß水𝄋

[編集] 関連項目

指定された状態を使用して次のマルチバイト文字をワイド文字に変換します
(関数) [edit]
次のマルチバイト文字のバイト数を返します
(関数) [edit]
[仮想]
そのようなファイルからの読み込みの場合のように、externTからinternTに文字列を変換します
Original:
converts a string from externT to internT, such as when reading from file
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(std::codecvtの仮想プロテクテッドメンバ関数) [edit]