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

[debian-devel:09549] locale bug ? (Re: Re: mh-ja in potato-jp)



佐野@浜松です。

In article <19990614194810P.xlj06203@xxxxxxxxxxxxxxxxxxxx>
 私:

> やっと原因がわかりました。bash の bug です。(bug-ja が動かなくなって
> いるのと同じ) LANG=ja_JP.ujis LC_ALL 設定無しだと [A-Z]* に 小文字が
> 全部反応してしまいます。LC_ALL=C または LC_ALL 設定無しで LANG=C と
> すればちゃんと [A-Z]* で大文字だけ反応します。

これって「bash の bug」というより、「glibc2.1 の locale に関する bug」
なんでしょうか。吉山さんや花高さんの作業に期待、なのかな ?

現在の環境は

ii  libc6           2.1.1-10       GNU C Library: Shared libraries and timezone
ii  ldso            1.9.11-2       The Linux dynamic linker, library and utilit
ii  locale-ja       2.1.1.1        Locale definition files for Japanese.
ii  locales         2.1.1-10       GNU C Library: National Language (locale) da

-- System Information
Debian Release: potato
Kernel Version: Linux yadon 2.2.9 #1 Fri Jun 11 14:20:32 JST 1999 i586 unknown

です。

確認するには

for i in a b c x y z A B C X Y Z; 
  do 
    case "$i" in 
     [A-Z]) echo "$i is capital";; 
     [a-z]) echo "$i is small";; 
    esac; 
  done

をファイルに保存して、 sh で実行してみてください。
例えば chk.sh という名前で保存して、 sh chk.sh を実行すると

 $ /bin/sh ./chk.sh 
a is capital
b is capital
c is capital
x is capital
y is capital
z is small
A is capital
B is capital
C is capital
X is capital
Y is capital
Z is capital

となります。(LANG=ja_JP.ujis とし、LC_ALL, LC_COLLATE は未設定)

最初のコマンド名を /bin/bash, bash, sh としても同様になります。

export LC_COLLATE=C とすれば

sh ./chk.sh 
a is small
b is small
c is small
x is small
y is small
z is small
A is capital
B is capital
C is capital
X is capital
Y is capital
Z is capital

と期待される出力になります。

面白いことに、export LC_COLLATE=en_US の場合も

a is capital
b is capital
c is capital
x is capital
y is capital
z is small
A is capital
B is capital
C is capital
X is capital
Y is capital
Z is capital

となります。LANG=en_US, unset LC_COLLATE でも同様。

また export LC_COLLATE=japan とすると、上記の期待される出力に
なります。(存在しない locale 名は C に設定されるのだろうか)

それから、いったん LC_ALL=C, LC_COLLATE=C に設定して、
その後で unset すると、同じシェルの中ではその設定が維持される
ようです。現在 /etc/profile で

LANG=C
LC_COLLATE=C
LC_ALL=C
export LANG LC_COLLATE LC_ALL
unset LC_ALL LC_COLLATE

としてますが、この状態から export LANG=ja_JP.ujis しても

 $ printenv |grep LC

 $ printenv |grep LANG
LANG=ja_JP.ujis

 $ . ./chk.sh 
a is small
b is small
c is small
x is small
y is small
z is small
A is capital
B is capital
C is capital
X is capital
Y is capital
Z is capital

となり、正常動作となります。

とりあえず、export LC_COLLATE=C としておけば良いのかな、
という気もするんですが、これで本当に良いのかどうか、、、

-- 
     #わたしのおうちは浜松市、「夜のお菓子」で有名さ。
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)