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

[debian-devel:10356] Re: wchar_t (Re: I18N Document)



まだ だれも答えてないようなので…

At Mon, 6 Sep 1999 17:12:21 +0900,
Tomohiro KUBOTA <kubota@xxxxxxxxxxxxxxxxxxxxx> wrote:

> C 言語のワイド文字列のテストのつもりで、このようなプログラムを作りました。

return value をチェックする癖をつけていればすぐわかったかもしれませんね:)
 
> -------- wchar.c ---------
> #include <stdio.h>
> #include <locale.h>
> #include <string.h>
> #include <stdlib.h>
> 
> main()
> {
> 	char buf[1000];
> 	wchar_t wbuf[1000];
> 	int j, len;
> 
> 	setlocale(LC_ALL, "");

	if (setlocale(LC_ALL, "") == NULL) {
		perror("setlocale");
	}

とでもしておくと

> ここで、EUC-JP で 'あ' は 0xa4, 0xa2 ですので、ISO 8859-* とかでも
> 正常な文字として認識されるはずです。それをためしてみようとして、
> 
> $ LANG=fr ./wchar
> 
> とか、LANG をいろいろと変えてみましたが、どうしても
> その部分で len=-1 (wctomb の異常終了) と出ます。私の予想では、
> 画面はこわれてもいいから、len=1 が 9 回出て来てほしいんですが。

LANG=fr では setlocale(3) に成功しません。

 % LANG=fr ./wchar
 setlocale failed: Aucun fichier ou repertoire de ce type

LANG=fr_FR などでは成功し、久保田さんの予想通りの結果になります。

> 考えられる理由としては、
> 
> 1. LANG に与える文字列が間違っている。
> 2. ISO 8859-* はサポートされていない。
> 3. インストールするパッケージが間違っている。
> 
> くらいが思い付きますが、LANG は fr とか it とか es とか
> 思い付くままにやってみましたがだめでした。

1 です。locale -a ででてくるのでいろいろ試してみるとよいでしょう。
# locale -a ででてくるからといって setlocale(3)は成功しないことに注意。

> ちなみに、LANG=ja_JP.sjis としても、LANG=ja_JP.ujis としても、
> EUC-JP の入力しか受け付けないようですね。glibc 2.1 が「いいかげん」
> だというのはこのことでしょうか?

ja_JP.sjis, ja_JP.ujis な locale database がないからです。
(で fallback して ja_JP になり EUC-JP となっていると思われる)

試しに /usr/share/locale で ja_JP.sjis directory を作り
LC_* を ja_JP/ から symlink して LANG=ja_JP.sjis で実行すると
予想通りの動作をします。

locale-ja が ja_JP.sjis を ja_JP.ujis のようにつくっておく
べきなのかもしれない。

なお、現在 locale-ja で提供している locale database は嘘データです。
これは localedef などがまだ multibyteを扱えなかったためです。
# まだ 駄目かな…

-- 
鵜飼文敏