c32rtomb() — マルチバイト文字への char32_t 文字の変換

標準

標準/拡張機能 C/C++ 依存項目

ISO C 改訂
C11

両方 z/OS® V2R1

形式

#include <uchar.h>

size_t c32rtomb(char * restrict s, char32_t c32, mbstate_t * restrict ps);

機能説明

c32rtomb() 関数は、char32_t 型のワイド文字をマルチバイト文字に変換し、s に格納されるバイト数を戻します (シフト・シーケンスを含む)。

s が NULL ポインターでない場合は、c32rtomb() 関数は c32 によって指定されたワイド文字に対応するマルチバイト文字 (シフト・シーケンスを含む) を表すのに必要なバイト数を判別し、マルチバイト文字表現を最初のエレメントが s によって指定される配列に格納します。最大で MB_CUR_MAX バイトが格納されます。c32 が NULL ワイド文字の場合には、初期シフト状態を復元するために必要なシフト・シーケンスが前に付いた NULL バイトが格納されます。記述されている結果の状態は初期変換状態です。

s が NULL ポインターである場合、c32rtomb() 関数は、c32rtomb(buf, L'¥0', ps) 呼び出しと同等になります。ここで、buf は内部バッファーです。

ps が NULL ポインターである場合、c32rtomb() は独自の内部オブジェクトを使用してシフト状態をトラッキングします。そうでない場合、*ps は、有効な mbstate_t オブジェクトでなければなりません。mbstate_t オブジェクト *ps に 0 を割り当てるか、c32rtomb(NULL, L'¥0', ps) を呼び出すことによって、このオブジェクトを初期状態に初期化できます。

使用上の注意

  1. c32rtomb() 関数を使用するには、LANGLVL(EXTC1X) オプションを指定してソース・コードをコンパイルします。
  2. EBCDIC MBCS など、ステートフル・マルチバイト・エンコードの結果 s は、変換状態に従ってシフト・バイトを省略する必要があります。出力シーケンス内の最初の DBCS 文字にはシフトアウト文字のみがあり、以降の文字にはシフトアウトもシフトインもありません。終了シフトインは、SBCS 文字または NULL ワイド文字が検出されるまで生成されません。
  3. c32rtomb() 関数は、Unicode Services によって提供される CCSID のみをサポートします。
  4. Unicode 結合文字はサポートされず、ターゲット CCSID の置換文字に変換されます。
  5. 複数の mbstate_t オブジェクト (内部のものを含む) を使用して、複数のストリングを 1 つのスレッドで交互に変換した結果は、未定義です。

戻り値

c32rtomb() 関数は、配列オブジェクト (シフト・シーケンスを含む) に格納されているバイト数を戻します。c32 が有効なワイド文字でない場合、エンコード・エラーが発生します。この関数は errno に EILSEQ マクロの値を格納し、(size_t)(-1) を戻します。変換状態は未指定です。

#include <stdio.h>
#include <stdlib.h>
#include <uchar.h>

int main(void)
{
   char32_t in = U'a';
   mbstate_t st = 0;
   char out[MB_CUR_MAX];
   int rc, i;
   rc = c32rtomb(out, in, &st);
   if (rc < 0) {
      perror("c32rtomb() fails to convert");
      exit(-1);
   }
   printf(" c32: 0x%04x ¥n", in);
   printf(" return code: %d ¥n", rc);
   printf(" mb character: ");
   for (i=0; i<rc; i++)
      printf(" 0x%02x", out[i]);
   printf("¥n");                                                                
   return 0;
}
出力:
c32: 0x00000061
return code: 1
mb character:  0x81