namazu-dev(ring)


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

Re: tolower()



安部です。あけましておめでとうございます。

Satoru Takabayashi wrote:

> いくつかのシステムでは locale が絡むと tolower(3) の挙動がお
> かしくなるのだと思います (fjで読んだ気がする)。

tolowerのman pageによるとバグの項に、

       なにが大文字でなにが小文字なのかということの詳細は、 現 在
       のlocaleに 依 存 し て い る。 た とえば、デフォルトの "C"
       localeではウムラウトを認識しないため、それらの文字は変換で
       きない。

       いくつかの非英語localeでは、対応する大文字を持たない小文字
       が存在する。ドイツ語のエスツェットが一つの例である。

とあります。

> 回避策として、 tolower(3) を使わずに、自前で用意した
> nmz_tolower() を使うようにしました。 最新のコードで試しても
> らえると助かります。

これ、K&R本に出ているlowerと同じもので、tolowerになっていません。
(charset independentじゃない)

strの指しているものがマルチバイト文字列のときに無条件に
*str = tolower(*str)
ではまずいでしょう。パッチを作ってみたので試してもらえます?
(特にKenjiさんと藤原さん)


  A A
= . . =
   V
end
Ryuji Abe
--- util.c.orig	Sat Jan  1 23:48:47 2000
+++ util.c	Sat Jan  1 23:40:29 2000
@@ -34,7 +34,6 @@
 
 static void reverse_byte_order (void*, int, int);
 static char decode_uri_sub(char c1, char c2);
-static int nmz_tolower(int c);
 
 /* reverse byte order */
 static void reverse_byte_order (void *p, int n, int size)
@@ -62,16 +61,6 @@
     return c;
 }
 
-/* substitute for tolower(3) */
-static int nmz_tolower(int c)
-{
-    if (c >= 'A' && c <= 'Z') {
-	c = 'a' + c - 'A';
-	return c;
-    }
-    return c;
-}
-
 /*
  *
  * Public functions
@@ -377,12 +366,9 @@
 void nmz_strlower(char *str)
 {
     while (*str) {
-	/* 
-	 * Cannot use tolower(3) because of some system's
-	 * poor implementention. maybe locale problem?
-	 * [namazu-dev 1058]
-	 */
-        *str = nmz_tolower(*str);
+        if (isascii(*str)) {
+            *str = tolower(*str);
+        }
         str++;
     }
 }