C++
 Computer >> コンピューター >  >> プログラミング >> C++

C/C++のmbrtowc()関数とは?マルチバイト文字列をワイド文字に変換する方法

mbrtowc()関数は、マルチバイト文字列(マルチバイトシーケンス)をワイド文字に変換するための標準ライブラリ関数です。「mbrtowc」は「multibyte restartable to wide character」の略で、名前の通り変換状態(mbstate_t)を保持しながら再開可能な変換を行える点が特徴です。

この関数は、変換に成功すると入力から消費したマルチバイト文字のバイト数を戻り値として返します。構文は以下の通りです。

mbrtowc(wchar_t* wc, const char* s, size_t max, mbstate_t* ps)

引数の説明

  • wc:変換結果のワイド文字を格納する場所へのポインタです。
  • s:入力となるマルチバイト文字列へのポインタです。
  • max:s 内で調べることができる最大バイト数です。
  • ps:マルチバイト文字列を解釈する際の変換状態(conversion state)を指すポインタです。

使用例

以下のサンプルコードでは、UTF-8エンコーディングの文字列を1文字ずつワイド文字に変換し、各文字が何バイトで構成されているかを出力しています。

#include <bits/stdc++.h>
using namespace std;

void display(const char* s) {
    mbstate_t ps = mbstate_t(); // 初期状態
    int s_len = strlen(s);
    const char* n = s + s_len;
    int len;
    wchar_t wide_char;
    while ((len = mbrtowc(&wide_char, s, n - s, &ps)) > 0) {
        wcout << "次の " << len << " バイトは文字 " << wide_char << " に対応しています\n";
        s += len;
    }
}

main() {
    setlocale(LC_ALL, "en_US.utf8");
    const char* str = u8"z\u00cf\u7c38\U00000915";
    display(str);
}

実行結果

次の 1 バイトは文字 z に対応しています
次の 2 バイトは文字 Ï に対応しています
次の 3 バイトは文字 簸 に対応しています
次の 3 バイトは文字 क に対応しています

ポイントまとめ

  • mbrtowc() は1回の呼び出しで1文字分だけ変換するため、ループ処理と組み合わせて文字列全体を変換します。
  • 戻り値が (size_t)-2 の場合は不完全なマルチバイトシーケンスであることを示し、(size_t)-1 の場合は不正なシーケンスを意味します。
  • ロケール設定(setlocale)によってマルチバイトエンコーディングの解釈が変わるため、事前に適切なロケールを設定しておくことが重要です。
  1. C/C++のmbsrtowcs()関数とは?構文・パラメータ・戻り値と実例を解説

    本記事では、C++ STLに含まれるstd::mbsrtowcs()関数の仕組み、構文、および具体的な使用例について詳しく解説します。 std::mbsrtowcs()とは? std::mbsrtowcs()は、C++ STLに組み込まれている関数で、<cwchar>ヘッダーファイル内で定義されています。関数名のmbsrtowcs()は「multibyte string to wide character string(マルチバイト文字列からワイド文字列への変換)」を意味し、再開可能な変換状態を維持しながら、NULL終端されたマルチバイト文字列をワイド文字列表現へと変換します。この

  2. C/C++のsystem()関数とは?使い方と実行例を徹底解説

    この記事では、C/C++におけるsystem()関数の基本的な使い方と動作について、具体例を交えながら詳しく解説します。 system()関数は、C/C++標準ライブラリに含まれる関数の一つです。オペレーティングシステムのコマンドプロセッサ(コマンドプロンプト)やターミナルで実行可能なコマンドをプログラムから渡して実行でき、コマンドの処理が完了すると制御をプログラムに戻します。 この関数を使用するには、ヘッダーファイル<stdlib.h>(C++の場合は<cstdlib>)をインクルードする必要があります。 構文 system()関数の構文は以下の通りです。 int