wcstok_wcstombs_etc - アールメカブ

アールメカブ


wcstok_wcstombs_etc

Programming_C

全くやっかいだ.setlocale(LC_ALL, ""); を空で呼び出す理由がよく分からなかったのだが,setlocaleのmanページにはちゃんと

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>//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);

 
Link: Programming_C(5430d)
Last-modified: 2008-08-28 (木) 12:29:42 (5714d)