localeに依存しますがmblen
が使えます。
まず、locale -a
コマンドで使えるロケールを確認します。
sjisが使えそうなやつ(ja_JP.SJIS
的な)がなければ
sudo localedef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.SJIS
コマンドで追加します。
(Centos7の場合、他のLinuxの場合も同じなのかは要確認)
後は、
c
1#include <stdio.h>
2#include <stdlib.h>
3#include <locale.h>
4
5int main(void)
6{
7 const unsigned char s[] = "\x96\xBC\x91\x4F2018/0703\x8E\xBF\x96\xE2\x82\xC5\x82\xB7\x81\x42\x82\xE6\x82\xEB\x82\xB5\x82\xAD\x82\xA8\x8A\xE8\x82\xA2\x82\xB5\x82\xDC\x82\xB7!!";
8 int len, i=0;
9
10 setlocale( LC_CTYPE, "ja_JP.SJIS" );
11
12 while( s[i] != '\0' ){
13 len = mblen( (char*)&s[i], MB_CUR_MAX );
14 printf( "%d ", len );
15 if(len == -1){
16 puts("不正な文字です");
17 return 0;
18 }
19 i += len;
20 }
21
22 return 0;
23}
で、それぞれの文字が何バイトかが取得できます。