[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:05059] locale switching on glibc-wcsmbs



田中@東大工学部です。

libc6とwcsmbsのおかげで、X_LOCALEに頼らなくても、マルチバイト文字を扱
えるようになって大変便利になりました。感謝しております。

#そういえば、XFree86-3.3.2からのLinux-ix86-glibcのバイナリには、
#デフォルトで、X_LOCALEが含まれてませんね。

が、以下のようなコードを、

----------------------------------------
#include <X11/Xlocale.h>
#include <stdarg.h>

#ifdef X_LOCALE
#define mblen(a, b) _Xmblen((a), (b))
#endif
 
void title()
{
#ifndef X_LOCALE
  printf ("[LIBC_LOCALE] ");
#else
  printf ("[X_LOCALE] ");
#endif
  printf ("[%s]\n", setlocale(LC_ALL, ""));
}

void check(char* str)
{
  printf ("[%2d] %s\n", mblen(str, 4), str);
}

void chglocale(char* str)
{
  printf ("locale %s\n", setlocale(LC_ALL, str));
}

void main ()
{
  chglocale("ja_JP.ujis");
  title();
  check("漢字");
  chglocale("fr_FR");
  check("漢字");
  chglocale("C");
  check("漢字");
  chglocale("ja_JP.ujis");
  check("漢字");
}
----------------------------------------

gcc -g -o test_mblen_c test_mblen.c 
と、コンパイルして、実行すると、

$ ./test_mblen_c
locale ja_JP.ujis
[LIBC_LOCALE] [ja_JP.ujis]
[ 2] 漢字
locale fr_FR
[-1] 漢字
locale C
[-1] 漢字
locale ja_JP.ujis
[-1] 漢字

となります。
つまり、始めにja_JPにしたあと、別のlocaleにきりかえると、再び
ja_JPに戻しても正しい動作をしてくれません。

通常こんな使い方はしないと思うのですが、gimp/gtkにこのようなコードがふ
くまれています。

これって、仕様なのでしょうか?

------------------------------------------------------------
田中伸哉(たなか・しんや)
shinya@xxxxxxxxxxxxxxxxxx