mbtowc
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <stdlib.h> で定義
|
||
int mbtowc( wchar_t *pwc, const char *s, size_t n ) |
(C99未満) | |
int mbtowc( wchar_t *restrict pwc, const char *restrict s, size_t n ) |
(C99以上) | |
s によって最初のバイトが指されているマルチバイト文字をワイド文字に変換し、 pwc がヌルでなければ *pwc に書き込みます。
s がヌルポインタの場合は、グローバルな変換状態をリセットし、シフトシーケンスが使用されるかどうかを調べます。
ノート
mbtowc を呼ぶたびに、内部のグローバルな変換状態 (この関数のみが使用する mbstate_t 型の静的オブジェクト) を更新します。 マルチバイトエンコーディングがシフト状態を使用する場合、バックトラッキングや複数回のスキャンを避けるように注意しなければなりません。 いずれの場合でも、複数のスレッドが同期せずに mbtowc を呼ぶべきではありません。 代わりに mbrtowc を使用することができます。
引数
| pwc | - | 出力用のワイド文字を指すポインタ |
| s | - | マルチバイト文字を指すポインタ |
| n | - | 調べることができる s 内のバイト数の制限 |
戻り値
s がヌルポインタでなければ、そのマルチバイト文字に含まれるバイト数を返します。 s の指す最初のバイト列が有効なマルチバイト文字を形成しない場合は -1、 s がヌル文字 '\0' を指す場合は 0 を返します。
s がヌルポインタであれば、内部の変換状態を初期シフト状態を表すようにリセットし、現在のマルチバイトエンコーディングが状態依存でない (シフトシーケンスを使用しない) 場合は 0、現在のマルチバイトエンコーディングが状態依存 (シフトシーケンスを使用する) の場合は非ゼロの値を返します。
例
Run this code
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
// print multibyte string to wide-oriented stdout
// equivalent to wprintf(L"%s\n", ptr);
void print_mb(const char* ptr)
{
mbtowc(NULL, 0, 0); // reset the conversion state
const char* end = ptr + strlen(ptr);
int ret;
for (wchar_t wc; (ret = mbtowc(&wc, ptr, end-ptr)) > 0; ptr+=ret) {
wprintf(L"%lc", wc);
}
wprintf(L"\n");
}
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
// UTF-8 narrow multibyte encoding
print_mb(u8"z\u00df\u6c34\U0001F34C"); // or u8"zß水🍌"
}
出力:
zß水🍌
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.22.7.2 The mbtowc function (p: 358)