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);