wcsnrtombs -
ワイド文字文字列をマルチバイト文字列に変換する
#include <wchar.h>
size_t wcsnrtombs(char *dest, const wchar_t **src, size_t nwc,
size_t len, mbstate_t *ps);
wcsnrtombs():
- glibc 2.10 以降:
- _POSIX_C_SOURCE >= 200809L
- glibc 2.10 より前:
- _GNU_SOURCE
wcsnrtombs() 関数は、
wcsrtombs()
関数に似ている。ただし、
変換されるワイド文字の数が(
*src から数えて)
nwc
文字に制限
されている点が異なる。
dest が NULL でなければ、
wcsnrtombs() 関数は
ワイド文字文字列の最大
nwc
個までのワイド文字を
dest から
始まるマルチバイト文字列に変換する。
dest には最大
len バイ
トまで書き込まれる。シフト状態
*ps
は更新される。実際の効果とし
ては、この変換は以下の動作と同じになる:
wcrtomb(dest, *src, ps)
を呼び、成功が返ったら
dest
を書き込んだバイト数だけ増やし、
*src を 1 増やす。
そして、wcrtomb
が成功を返す限りこれを繰り返す。
変換が止まる理由は 3
つ考えられる:
- 1.
- (現在のロケールに基づいて)マルチバイト列で表現できないワイド文字に
出会った場合。この場合は、
*src
は不正なワイド文字を指した状態になり、
(size_t) -1
が返され、errno に
EILSEQ
が設定される。
- 2.
- ヌルワイド文字
(L'\0') に出会わないで
nwc
個のワイド文字を
変換した場合か、長さの制限によって変換が止められた場合。
この場合には、 *src
は次に変換されるべきワイド文字を指した状態になり、
dest
に書き込まれたバイト数が返される。
- 3.
- ワイド文字列が終端の
L'\0' (これには *ps
を初期状態に戻すという副作用がある)
も含めて全て変換された場合。この場合には
*src に NULL が設定され、
dest
に書き込まれたバイト数が返される
(終端のヌルバイト ('\0')
は数えない)。
dest が NULL ならば
len
は無視されて前述のように変換が行わ
れるが、変換されたバイトデータはメモリーに書き出されない点と、出力先の長
さの制限がない点が異なる。
上記のいずれの場合も、
ps が NULL ならば、
wcsnrtombs()
関数
だけが知っている静的な匿名の状態がシフト状態の代わりに用いられる。
プログラマは少なくとも
len バイトの領域を
dest に確保しな
ければならない。
wcsrtombs()
は、変換して得られたマルチバイト列のバイト数を返す。
これには終端の null
バイトは含まれない。
変換できないワイド文字に出会った場合には
(size_t) -1 が返され、
errno に
EILSEQ
が設定される。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
wcsnrtombs() |
Thread safety |
MT-Unsafe race:wcsnrtombs/!ps |
POSIX.1-2008.
wcsnrtombs()
の動作は現在のロケールの
LC_CTYPE
カテゴリーに依存する。
ps に NULL
を渡した際の動作はマルチスレッドセーフでない。
iconv(3),
mbsinit(3),
wcsrtombs(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。