2007-10-09

isspace(3) 追試

#include <ctype.h>
#include <stdio.h>
#include <locale.h>
int main()
{
int c;
setlocale(LC_CTYPE, "");
while ((c = fgetc(stdin)) != EOF)
printf("0x%x %d\n", c, isspace(c));
return 0;
}

でもって
$ ./a.out
しゅ
0xe3 0
0x81 0
0x97 0
0xe3 0
0x82 0
0x85 0
0xa 1

なわけですが、LC_CTYPEがUTF-8だと

$ LANG=ja_JP.UTF-8 ./a.out 
しゅ
0xe3 0
0x81 0
0x97 0
0xe3 0
0x82 0
0x85 1

0xa 1


「ゅ」の最後のバイトが空文字と判定されてしまうと。

http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/isspace.3.html
(FreeBSDのマニュアルと同じだ。FreeBSDでのisspaceの挙動も同じ。)

マルチバイト文字ロケールでUTF-8文字列をisspaceに突っ込むな or LC_CTYPE="C"でisspaceを呼ぶべし、でしょうか。