ワイド文字

マルチバイト文字のバイト数取得

mblen.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
  stdlib.h [mblen]
  
  書式: int mblen(const char *s, size_t n)
  機能: マルチバイト文字の長さを取得
  引数: const char *s: マルチバイト文字
        size_t n: 判定するバイト数
  戻り値: 成功すると, マルチバイト文字のバイト数を返し,
          失敗すると, -1 を返す.
*/

/*
  MB_CUR_MAX: 現在のロケールの LC_CTYPE 設定で, マルチバイト文字 1 文字に
              必要な最大バイト数.
  MB_LEN_MAX: 全てのロケールで, マルチバイト文字 1 文字に必要な最大バイト
              数.
*/

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

int main(void){
  
  char *s = "テストAB";
  int i = 0;
  int len;

  setlocale( LC_CTYPE, "jpn" );

  while( s[i] != '\0' ){
    len = mblen( &s[i], MB_CUR_MAX );
    printf( "%x -- %x\n", s[i], len );
    i += len;
  }
  
  return 0;
}

mblen.c の実行結果は:

[cactus:~/code_c/refer]% ./mblen
ffffffe3 -- 1
ffffff83 -- 1
ffffff86 -- 1
ffffffe3 -- 1
ffffff82 -- 1
ffffffb9 -- 1
ffffffe3 -- 1
ffffff83 -- 1
ffffff88 -- 1
41 -- 1
42 -- 1

マルチバイト文字をワイド文字に変換

mbtowc.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
  stdlib.h [mbtowc]
  
  書式: int mbtowc(wchar_t *wc, const char *mc, size_t n)
  機能: マルチバイト文字からワイド文字に変換
  引数: wchar_t *wc: 変換したワイド文字を格納するポインタ
        const char *mc: 変換元のマルチバイト文字
	size_t n: 変換するバイト数
  戻り値: 成功すると, マルチバイト文字のバイト数を返し,
          失敗すると, -1 を返す.
*/

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

int main(void){
  
  char *mc = "あ";
  wchar_t wc;
  int len;

  setlocale( LC_CTYPE, "jpn" );

  len = mbtowc(&wc, mc, MB_CUR_MAX);

  printf("マルチバイト文字長は: %d バイト\n", len);
  printf("ワイド文字は: %lc\n", wc);
  
  return 0;
}

mbtowc.c の実行結果は:

[cactus:~/code_c/refer]% ./mbtowc
マルチバイト文字長は: 1 バイト
ワイド文字は: ?

マルチバイト文字列をワイド文字列に変換

mbstowcs.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
  stdlib.h [mbstowcs]
  
  書式: int mbstowcs(wchar_t *ws, const char *ms, size_t n)
  機能: マルチバイト文字列からワイド文字列に変換
  引数: wchar_t *ws: 変換したワイド文字列を格納するポインタ
        const char *ms: 変換元のマルチバイト文字列
        size_t n: ワイド文字の文字数を指定
  戻り値: 成功すると, 変換したワイド文字の文字数を返し,
          失敗すると, -1 を返す.
*/

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

int main(void){
  
  char *ms = "テストtestてすと";
  wchar_t ws[100];
  int len;

  setlocale( LC_CTYPE, "jpn" );

  len = mbstowcs(ws, ms, 100);

  printf("ワイド文字数は: %d 文字\n", len);
  printf("ワイド文字は: %ls\n", ws);
  
  return 0;
}

mbstowcs.c の実行結果は:

[cactus:~/code_c/refer]% ./mbstowcs
ワイド文字数は: 22 文字
ワイド文字は: テストtestてすと

ワイド文字をマルチバイト文字に変換

wctomb.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
  stdlib.h [wctomb]
  
  書式: int wctomb(char *s, wchar_t wc)
  機能: ワイド文字からマルチバイトに変換
  引数: char *s: 変換したマルチバイト文字を格納するポインタ
        wchar_t wc: 変換元のワイド文字
  戻り値: 成功すると, マルチバイト文字のバイド数を返し,
          失敗すると, -1 を返す.
*/

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

int main(void){
  
  wchar_t wc = L'あ';
  char mc[2];
  int len;

  setlocale( LC_CTYPE, "jpn" );

  len = wctomb(mc, wc);

  printf("マルチバイト文字長は: %d バイト\n", len);
  printf("マルチバイト文字はは: %c %c\n", mc[0], mc[1]);
  
  return 0;
}

wctomb.c の実行結果は:

[cactus:~/code_c/refer]% ./wctomb
マルチバイト文字長は: -1 バイト
マルチバイト文字はは:

ワイド文字列をマルチバイト文字列に変換

wcstombs.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
  stdlib.h [wcstombs]
  
  書式: int wcstombs(char *ms, const wchar_t *ws, size_t n)
  機能: ワイド文字列からマルチバイト文字列に変換
  引数: char *ms: 変換されたマルチバイト文字列を格納するポインタ
        const wchar_t *ws: 変換元のワイド文字列
        size_t n: マルチバイト文字のバイト数を指定
  戻り値: 成功すると, 変換したマルチバイト文字列のバイト数を返し,
          失敗すると, -1 を返す.
*/

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

int main(void){
  
  wchar_t *ws = L"テストtestてすと";
  char ms[100];
  int len;

  setlocale( LC_CTYPE, "jpn" );

  len = wcstombs(ms, ws, 100);

  printf("マルチバイト文字長は: %d バイト\n", len);
  printf("マルチバイト文字はは: %s\n", ms);
  
  return 0;
}

wcstombs.c の実行結果は:

[cactus:~/code_c/refer]% ./wcstombs
マルチバイト文字長は: -1 バイト
マルチバイト文字はは: ??_?