# $BJ8;zNs=hM}$N9bB.2=(B?

**URL:** <https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395>\
**Category:** Development\
**Created:** [February 18, 2008, 8:11am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395 "2008-02-18T08:11:48Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 18, 2008, 8:11am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/1 "2008-02-18T08:11:48Z")

</div>

e$B$?$@$N0lNc$G$9$,!“@h=5$N6bMKF|$K\>\>K$5$s$K8+$;$?$H$-$Ke(B  
50e$BIC$0$i$$$+$+$C$?%W%m%0%i%`$O$=$N8e$Ne(B commit e$B$G$*$=$/$J$j!"e(B 65e$BIC$0$i$$$+$+$C$F$$$^$9!#%W%m%0%i%`$O0J2\<$NDL$je(B  
(e$B0JA0e(B Wolfgang Na’dasi-Donner e$B$,e(B ruby-core e$B$K=P$7$?e(B  
e$B$b$N$,%Y!\<%9$K$J$C$F$$$^$9!#e(B)  
e$BFC$K6bMKF|$NM\<J}$”$?$jJ8;zNs=hM}$de(B UTF-8 e$B$N=hM}$rAa$/$9$ke(B  
commit e$B$,?'!9$“$j$^$7$?$N$G!”$J$\<$GCY$/$J$k$N$+$r$A$g$C$He(B  
e$B5?Ld$K;W$C$F$$$^$9!#e(B

e$B59$7$/$\*4j$$$7$^$9!#e(B Martin.

# -_- encoding: utf-8 -_-

def scan\_s  
s = “e$B\>\>K\9T90e(B e$B\>\>9\>e(B e$BEg:,e(B” \* 5000  
i = 0  
10000.upto(30000) { |i| i+=1 if s[i]==‘a’ }  
puts i  
end

scan\_s

#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University  
#-#-# [http://www.sw.it.aoyama.ac.jp](http://www.sw.it.aoyama.ac.jp)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 18, 2008, 9:45am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/2 "2008-02-18T09:45:41Z")

</div>

e$B@.@%$G$9!#e(B

Martin D. wrote:

> # -_- encoding: utf-8 -_-
> 
> def scan\_s  
> s = “e$B\>\>K\9T90e(B e$B\>\>9\>e(B e$BEg:,e(B” \* 5000  
> i = 0  
> 10000.upto(30000) { |i| i+=1 if s[i]==‘a’ }  
> puts i  
> end
> 
> scan\_s

e$B$3$l$O8=:\_9bB.2=$,F/$+$J$$%1!\<%9$K$J$j$^$9!#$J$N$G!"9bB.2=$KH\<$&JQ99$GA}e(B  
e$B$($?J,4t$K$h$C$F5U$KCY$/$J$C$F$7$^$C$F$$$k$G$7$g$&!#e(B(e$B$?$V$se(B  
use  
search\_nonascii e$B$+$Je(B)

e$B0l9TB-$7$F!“e(B  
def scan\_s  
s = “e$B\>\>K\9T90e(B e$B\>\>9\>e(B e$BEg:,e(B” \* 5000  
s.valid\_encoding?  
i = 0  
10000.upto(30000) { |i| i+=1 if s[i]==‘a’ }  
puts i  
end  
e$B$H$9$k$H?tIC$G=_$o$k$h$&$K$J$k$H;W$$$^$9!#$G!"$3$N$h$&$J%1!\<%9$K$_$$$Fe(B  
validation  
e$B$r$I$3$+$N%?%$%\_%s%0$G$3$C$=$j$+$1$i$l$k$H$$$$$s$G$9$,!”$I$&e(B  
e$B$9$k$N$,$$$$$N$+$J$!$HG:$s$G$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 19, 2008, 1:21am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/3 "2008-02-19T01:21:22Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33838] e$BJ8;zNs=hM}$N9bB.2=e(B ?”  
on Mon, 18 Feb 2008 16:10:34 +0900, Martin D.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|e$B$?$@$N0lNc$G$9$,!“@h=5$N6bMKF|$K\>\>K$5$s$K8+$;$?$H$-$Ke(B  
|50e$BIC$0$i$$$+$+$C$?%W%m%0%i%`$O$=$N8e$Ne(B commit e$B$G$*$=$/$J$j!"e(B |65e$BIC$0$i$$$+$+$C$F$$$^$9!#%W%m%0%i%`$O0J2\<$NDL$je(B  
|(e$B0JA0e(B Wolfgang Na’dasi-Donner e$B$,e(B ruby-core e$B$K=P$7$?e(B  
|e$B$b$N$,%Y!\<%9$K$J$C$F$$$^$9!#e(B)  
|e$BFC$K6bMKF|$NM\<J}$”$?$jJ8;zNs=hM}$de(B UTF-8 e$B$N=hM}$rAa$/$9$ke(B  
|commit e$B$,?'!9$“$j$^$7$?$N$G!”$J$\<$GCY$/$J$k$N$+$r$A$g$C$He(B  
|e$B5?Ld$K;W$C$F$$$^$9!#e(B

strlene$B$G$Oe(Bcoderangee$B$,@\_Dj$5$l$J$$$+$i7k6Ie(BUTF-8e$B$N:GE,2=$,F/$+e(B  
e$B$J$$$+$i$N$h$&$G$9!#BP:v$H$7$F$Oe(B

- UTF-8e$B:GE,2=$re(BENC\_CODERANGE\_VALIDe$B$G$J$/$F$bF0$/$h$&$K$9$ke(B  
(e$BFq$7$=$&e(B)
- strlene$B$Ge(Bcoderange\_scan()e$BAjEv$rF1;~$K9T$&e(B

e$B$N$$$:$l$+$,9M$($i$l$^$9!#$H$j$"$($:!"8e\<T$NBP:v$r\<BAu$7$F$\_e(B  
e$B$?$H$3$m!"e(BMartine$B$5$s$NNc$G$Oe(B23.95se$B$,e(B2.89se$B$K$J$j$^$7$?!#e(B

e$B%Q%C%A$G$9!#$@$l$+$,%/%j!\<%s%"%C%W$7$F$/$l$k$H$&$l$7$$!#e(B

diff --git a/string.c b/string.c  
— a/string.c  
+++ b/string.c  
@@ -619,10 +619,64 @@ rb\_enc\_strlen(const char \*p, const char \*e,  
rb\_encoding \*enc)  
return c;  
}

+long  
+rb\_enc\_strlen\_cr(const char \*p, const char \*e, rb\_encoding \*enc, int  
\*cr)  
+{

- long c;
- const char \*q;
- int ret;
- 
- \*cr = 0;
- if (rb\_enc\_mbmaxlen(enc) == rb\_enc\_mbminlen(enc)) {
- 

```
   return (e - p) / rb_enc_mbminlen(enc);

```

- }
- else if (rb\_enc\_asciicompat(enc)) {
- \*cr = ENC\_CODERANGE\_7BIT;
- 

```
   c = 0;

```

- 

```
   while (p < e) {

```

- 

```
       if (ISASCII(*p)) {

```

- 

```
           q = search_nonascii(p, e);

```

- 

```
           if (!q) {

```

- 

```
               return c + (e - p);

```

- }
- 

```
           c += q - p;

```

- 

```
           p = q;

```

- 

```
       }

```

- 

```
       ret = rb_enc_precise_mbclen(p, e, enc);

```

- 

```
       if (MBCLEN_CHARFOUND_P(ret)) {

```

- if (\*cr != ENC\_CODERANGE\_BROKEN)
- 

```
   *cr = ENC_CODERANGE_VALID;

```

- p += MBCLEN\_CHARFOUND\_LEN(ret);
- 

```
       }

```

- 

```
 else {

```

- \*cr = ENC\_CODERANGE\_BROKEN;
- p++;
- 

```
 }

```

- 

```
       c++;

```

- 

```
   }

```

- 

```
   return c;

```

- }
- 
- for (c=0; p\<e; c++) {
- ret = rb\_enc\_precise\_mbclen(p, e, enc);
- if (MBCLEN\_CHARFOUND\_P(ret)) {
- 

```
 if (*cr != ENC_CODERANGE_BROKEN)

```

- \*cr = ENC\_CODERANGE\_VALID;
- 

```
 p += MBCLEN_CHARFOUND_LEN(ret);

```

- }
- else {
- 

```
 *cr = ENC_CODERANGE_BROKEN;

```

- 

```
 p++;

```

- }
- }
- return c;  
+}
- 

static long  
str\_strlen(VALUE str, rb\_encoding \*enc)  
{  
const char \*p, \*e;

- int n, cr;

- return rb\_enc\_strlen(p, e, enc);

- n = rb\_enc\_strlen\_cr(p, e, enc, &cr);
- if (cr) {
- 

```
   ENC_CODERANGE_SET(str, cr);

```

- }
- return n;  
}

/\*

---

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 19, 2008, 2:55am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/4 "2008-02-19T02:55:08Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
“NARUSE, Yui” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> validation e$B$r$I$3$+$N%?%$%\_%s%0$G$3$C$=$j$+$1$i$l$k$H$$$$$s$G$9$,!"$I$&e(B  
> e$B$9$k$N$,$$$$$N$+$J$!$HG:$s$G$$$^$9!#e(B

e$B$^$:$OJ8;zNs%j%F%i%k$8$c$J$$$G$9$+$M$'!#e(B

---

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 19, 2008, 11:41am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/5 "2008-02-19T11:41:43Z")

</div>

e$B@.@%$G$9!#e(B

Yukihiro M. wrote:

> strlene$B$G$Oe(Bcoderangee$B$,@\_Dj$5$l$J$$$+$i7k6Ie(BUTF-8e$B$N:GE,2=$,F/$+e(B  
> e$B$J$$$+$i$N$h$&$G$9!#BP:v$H$7$F$Oe(B
> 
> - UTF-8e$B:GE,2=$re(BENC\_CODERANGE\_VALIDe$B$G$J$/$F$bF0$/$h$&$K$9$ke(B  
> (e$BFq$7$=$&e(B)

e$B%o!\<%I$4$H$K$^$H$a$F?t$($k$H$$$&\<jK!\<+BN$O2DG=$@$H;W$&$N$G$9$,!"e(B  
validation  
e$B$r9T$$$D$D?t$($k$H$J$k$H?tG\C10L$GCY$/$J$C$F$7$^$&$G$7$g$&$M!#e(B

e$B%o!\<%IC10L$Ge(B validation  
e$B$C$F$N$b9M$($F$O$$$k$N$G$9$,!"Aa$/$H$be(B10e$BG\L$K~$Je(B  
e$B$&$($Ke(B 1  
e$BEY$7$+9T$o$J$$$N$G%7%9%F%`$KBP$9$k%$%s%Q%/%H$,Dc$/!"0lJ}$G$+$Je(B  
e$B$jJ#;($K$J$j$=$&$J$N$G!"AGD\>$K%P%$%HC10L$GFI$s$@J}$,$h$5$=$&$G$9!#e(B

> - strlene$B$Ge(Bcoderange\_scan()e$BAjEv$rF1;~$K9T$&e(B

e$B$3$A$i$K2C$($F!“e(B[ruby-dev:33851] e$B$NJ8;zNs%j%F%i%k$de(B IO  
coderange\_scan  
e$B\<+BN$N:GE,2=$,$”$j$($k$+$J$H;W$C$F$$$^$9!#e(B

> e$B%Q%C%A$G$9!#$@$l$+$,%/%j!\<%s%"%C%W$7$F$/$l$k$H$&$l$7$$!#e(B  
> e$B$H$j$"$($:!"e(B

- if (\*cr != ENC\_CODERANGE\_BROKEN)
- 

```
   *cr = ENC_CODERANGE_VALID;

```

e$B$H$$$&J,4t$r$J$/$7$F$\_$^$7$?!#e(B

— string.c (revision 15548)  
+++ string.c (working copy)  
@@ -619,10 +619,63 @@ rb\_enc\_strlen(const char \*p, const char  
return c;  
}

+long  
+rb\_enc\_strlen\_cr(const char \*p, const char \*e, rb\_encoding \*enc, int  
\*cr)  
+{

- long c;
- const char \*q;
- int ret;
- 
- \*cr = 0;
- if (rb\_enc\_mbmaxlen(enc) == rb\_enc\_mbminlen(enc)) {
- 

```
  return (e - p) / rb_enc_mbminlen(enc);

```

- }
- else if (rb\_enc\_asciicompat(enc)) {
- 

```
  c = 0;

```

- 

```
  while (p < e) {

```

- 

```
      if (ISASCII(*p)) {

```

- 

```
          q = search_nonascii(p, e);

```

- 

```
          if (!q) {

```

- 

```
              return c + (e - p);

```

- 

```
          }

```

- 

```
          c += q - p;

```

- 

```
          p = q;

```

- 

```
      }

```

- 

```
      ret = rb_enc_precise_mbclen(p, e, enc);

```

- 

```
      if (MBCLEN_CHARFOUND_P(ret)) {

```

- 

```
          *cr |= ENC_CODERANGE_VALID;

```

- 

```
          p += MBCLEN_CHARFOUND_LEN(ret);

```

- 

```
      }

```

- 

```
      else {

```

- 

```
          *cr = ENC_CODERANGE_BROKEN;

```

- 

```
          p++;

```

- 

```
      }

```

- 

```
      c++;

```

- 

```
  }

```

- 

```
  if (!*cr) *cr = ENC_CODERANGE_7BIT;

```

- 

```
  return c;

```

- }
- 
- for (c=0; p\<e; c++) {
- 

```
  ret = rb_enc_precise_mbclen(p, e, enc);

```

- 

```
  if (MBCLEN_CHARFOUND_P(ret)) {

```

- 

```
      *cr |= ENC_CODERANGE_VALID;

```

- 

```
      p += MBCLEN_CHARFOUND_LEN(ret);

```

- 

```
  }

```

- 

```
  else {

```

- 

```
      *cr = ENC_CODERANGE_BROKEN;

```

- 

```
      p++;

```

- 

```
  }

```

- }
- if (!\*cr) \*cr = ENC\_CODERANGE\_7BIT;
- return c;  
+}
- 

static long  
str\_strlen(VALUE str, rb\_encoding \*enc)  
{  
const char \*p, \*e;

- int n, cr;

- return rb\_enc\_strlen(p, e, enc);

- n = rb\_enc\_strlen\_cr(p, e, enc, &cr);
- if (cr) {
- 

```
   ENC_CODERANGE_SET(str, cr);

```

- }
- return n;  
}

/\*

---

<div class="post-metadata">

**Author:** ![drenovac](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ea666f/32.png) [@drenovac](https://www.ruby-forum.com/u/drenovac)\
**Post date:** [February 19, 2008, 11:49am UTC](https://www.ruby-forum.com/t/bj8-zns-hm-n9bb-2-b/129395/6 "2008-02-19T11:49:23Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33860] Re: e$BJ8;zNs=hM}$N9bB.2=e(B ?”  
on Tue, 19 Feb 2008 19:40:44 +0900, “NARUSE, Yui”  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|\> \* strlene$B$Ge(Bcoderange\_scan()e$BAjEv$rF1;~$K9T$&e(B  
|  
|e$B$3$A$i$K2C$($F!“e(B[ruby-dev:33851] e$B$NJ8;zNs%j%F%i%k$de(B IO coderange\_scan  
|e$B\<+BN$N:GE,2=$,$”$j$($k$+$J$H;W$C$F$$$^$9!#e(B  
|  
|\> e$B%Q%C%A$G$9!#$@$l$+$,%/%j!\<%s%“%C%W$7$F$/$l$k$H$&$l$7$$!#e(B  
|e$B$H$j$”$($:!"e(B  
|+ if (\*cr != ENC\_CODERANGE\_BROKEN)  
|+ \*cr = ENC\_CODERANGE\_VALID;  
|e$B$H$$$&J,4t$r$J$/$7$F$\_$^$7$?!#e(B

e$B%3%\_%C%H$7$F$/$@$5$$$^$;$s$+!#%j%F%i%k$Ne(Bcoderange\_scane$B$O$=$Ne(B  
e$B$&$A\<j$r$D$1$?$$$G$9$M!#e(B
