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++;
}
}