[[Programming_C]] 全くやっかいだ.setlocale(LC_ALL, ""); を空で呼び出す理由がよく分からなかったのだが,[[setlocaleのmanページ:http://www.linux.or.jp/JM/html/LDP_man-pages/man3/setlocale.3.html]]にはちゃんと > locale が NULL ならば、現在のロケールを問い合わせるのみで変更はしない。 < > main プログラムの起動時には、互換性のある "C" ロケールがデフォルトで選択される。プログラムをすべてのロケールに対して互換にしたければ、プログラムの初期化の後に < setlocale(LC_ALL, ""); > を呼び出し、ロケール依存の情報には localeconv(3) の返り値を用い、 MB_CUR_MAX > 1 の場合には文字列の操作には多バイト文字、ワイド文字関数を使用し、文字列の比較には strcoll(3), wcscoll(3) や strxfrm(3), wcsxfrm(3) を用いる。 < と書いてあるではないか. #include <stdio.h> #include <stdlib.h> //#include <wchar.h> //#include <wchar.h>//stdio.h でも間に合うらしい #include <locale.h> #include <string.h> #define DELIMITER L"/ ,、。" /* 区切り文字 */ int main(int argc, char **argv) { setlocale(LC_ALL, "");//""は空のママにすること wchar_t wbuf[] = L"それは面白い。これも面白い。でも,それは面白くない."; char str[100]; wchar_t * node; wchar_t *endptr = NULL; node = wcstok(wbuf, DELIMITER,&endptr); // node = wcstok(wbuf, DELIMITER) はだめ while(node != NULL){ wcstombs(str,node, 100); // wctomb は一文字を変換 printf("str = %s\n", str); node = wcstok(NULL, DELIMITER,&endptr ); //node = strtok(NULL, ",");はだめ } return 0; } wcstombsは余地がある場合、マルチバイト文字列はヌル文字で終わります。 wcstombsなどを使わない他の変換方法としてこういう手もある. fputs("node = ", stdout); fputws(node, stdout); fputs("\n", stdout); printf("str = %.1s\n", str); printf("str = %.*s\n", str);