[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を扱えなかったためです。
# まだ 駄目かな…
--
鵜飼文敏