Namazu-devel-ja(旧)


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

Re: 「海」で検索すると文字化け



安部です。

On Mon, 02 Jul 2001 21:49:48 +0900
Rei FURUKAWA <furukawa@xxxxxxxxxxxx> wrote:

> _nmz_lower() ではなくて、strcasestr 自体が 2 バイト文字に対応し
> ていないのが原因だと思います。
> 
> 2 バイト文字だったら、次の 1 バイトとペアで比較して、ポインタも
> 2 つ進めないといけないですよね。
> 
> 直すこと自体は簡単ですが、locale なども考慮して、処理を切り替え
> ないといけないですよね?そこらへんで、どういうスタイルで直すべ
> きか、が私には判断できないです。

以下の修正をcommitしました。strcasestr()はglibcにも
あるのでmy_というprefixをつけておきました。


  A A
= . . =
   V
end
Ryuji Abe

Index: namazu/src/result.c
===================================================================
RCS file: /storage/cvsroot/namazu/src/result.c,v
retrieving revision 1.59
retrieving revision 1.59.8.1


diff -u -r1.59 -r1.59.8.1
--- namazu/src/result.c	2000/09/06 09:02:51	1.59
+++ namazu/src/result.c	2001/07/03 09:14:19	1.59.8.1
@@ -1,5 +1,5 @@
 /*
- * $Id: result.c,v 1.59 2000/09/06 09:02:51 rug Exp $
+ * $Id: result.c,v 1.59.8.1 2001/07/03 09:14:19 rug Exp $
  * 
  * Copyright (C) 1989, 1990 Free Software Foundation, Inc.
  * Copyright (C) 1997-1999 Satoru Takabayashi All rights reserved.
@@ -55,7 +55,7 @@
  */
 
 static void commas ( char *str );
-static char *strcasestr ( char *s1, char *s2 );
+static char *my_strcasestr ( char *s1, char *s2 );
 static void replace_field ( struct nmz_data d, int counter, const char
*field, char *result );
 static void encode_entity ( char *str );
 static void emphasize ( char *str );
@@ -90,7 +90,7 @@
  */
 
 static char *
-strcasestr (s1, s2)
+my_strcasestr (s1, s2)
      char *s1;
      char *s2;
 {
@@ -98,12 +98,19 @@
     char *p1;
     char *p2;
     char *s = s1;
+    int ja_mode;
 
+    ja_mode = nmz_is_lang_ja ();
+
     for (p2 = s2, i = 0; *s; p2 = s2, i++, s++) {
 	for (p1 = s; *p1 && *p2 && (_nmz_tolower(*p1) == _nmz_tolower(*p2));
p1++, p2++)
 	    ;
 	if (!*p2)
 	    break;
+	if (ja_mode && nmz_iseuc(*s)) {
+	    i++;
+	    s++;
+	}
     }
     if (!*p2)
 	return s1 + i;
@@ -209,7 +216,7 @@
 	keylen = strlen(key);
 
 	do {
-	    ptr = strcasestr(ptr, key);
+	    ptr = my_strcasestr(ptr, key);
 	    if (ptr != NULL) {
 		memmove(ptr + 2, ptr, strlen(ptr) + 1);
 		memmove(ptr + 1, ptr + 2, keylen);