# Tests for coderange information

**URL:** <https://www.ruby-forum.com/t/tests-for-coderange-information/225993>\
**Category:** Development\
**Created:** [February 17, 2008, 8:41am UTC](https://www.ruby-forum.com/t/tests-for-coderange-information/225993 "2008-02-17T08:41:29Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![NARUSES\_Yui](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/258eb7/32.png) [@NARUSES\_Yui](https://www.ruby-forum.com/u/NARUSES_Yui)\
**Post date:** [February 17, 2008, 8:41am UTC](https://www.ruby-forum.com/t/tests-for-coderange-information/225993/1 "2008-02-17T08:41:29Z")

</div>

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

Ruby e$B%l%$%d!\<$+$ie(B string e$B$Ne(B CODERANGE  
e$B\>pJs$,\<hF@$7$?$$$G$9!#e(B

UTF-8 e$BJ8;z%+%&%s%H$N9bB.2=$rF~$l$F5$IU$$$?$N$G$9$,!"e(Br15519  
e$B$^$G$Oe(B str1 +  
str2 e$B$de(B str \* 3 e$BEy$Ge(B CODERANGE  
e$B$N\>pJs$,\>C\<:$7$F$$$^$7$?!#$3$l$O=$@5$7$?e(B  
e$B$N$G$$$$$N$G$9$,!"8=:\_$OD\>$7$F$b%F%9%H$,$J$$$N$G$-$A$s$HD\>$C$F$$$k$+8e!9e(B  
e$B3NG’$G$-$^$;$s!#e(B

e$B0l0F$H$7$F$O!"e(B  
— string.c (revision 15519)  
+++ string.c (working copy)  
@@ -6009,6 +6009,33 @@ rb\_str\_is\_ascii\_only\_p(VALUE str)  
return cr == ENC\_CODERANGE\_7BIT ? Qtrue : Qfalse;  
}

+/\*

- 
  - vendor-specific method for testing CRuby coderange

- \*/  
+static VALUE  
+rb\_str\_coderange(VALUE self)  
+{
- VALUE val;
- switch (ENC\_CODERANGE(self))
- {
- case ENC\_CODERANGE\_UNKNOWN:
- val = LONG2FIX(0);
- break;
- case ENC\_CODERANGE\_7BIT:
- val = LONG2FIX(1);
- break;
- case ENC\_CODERANGE\_VALID:
- val = LONG2FIX(2);
- break;
- case ENC\_CODERANGE\_BROKEN:
- val = LONG2FIX(3);
- break;
- default:
- rb\_raise(rb\_eRuntimeError, “invalid coderange value”);
- }
- return val;  
+}
- 

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

- Document-class: Symbol
- 

@@ -6424,6 +6451,7 @@ Init\_String(void)  
rb\_define\_method(rb\_cString, “force\_encoding”,  
rb\_str\_force\_encoding, 1);  
rb\_define\_method(rb\_cString, “valid\_encoding?”,  
rb\_str\_valid\_encoding\_p, 0);  
rb\_define\_method(rb\_cString, “ascii\_only?”, rb\_str\_is\_ascii\_only\_p,  
0);

- rb\_define\_method(rb\_cString, “ **coderange** ”, rb\_str\_coderange, 0);

e$B$3$s$J46$8$G!"0J2\<$N$h$&$J%F%9%H$r=q$/$3$H$,$G$-$^$9!#e(B

#! ruby19

# coding: utf-8

require ‘test/unit’

class TestCoderange \< Test::Unit::TestCase  
CODERANGE\_UNKNOWN = 0  
CODERANGE\_7BIT = 1  
CODERANGE\_VALID = 2  
CODERANGE\_BROKEN = 3

def setup  
@str1 = “e$B$$$m$Oe(B”  
@str1v = @str1.dup  
@str1v.valid\_encoding?  
@str2 = “e$B%”%$%&e(B"  
@str2v = @str2.dup  
@str2v.valid\_encoding?  
@str3 = “ABC”  
@str3v = “ABC”  
@str3v.valid\_encoding?  
end

def test\_literal  
assert\_equal(CODERANGE\_UNKNOWN, @str1. **coderange** )  
assert\_equal(CODERANGE\_VALID, @str1v. **coderange** )  
assert\_equal(CODERANGE\_UNKNOWN, @str3. **coderange** )  
assert\_equal(CODERANGE\_7BIT, @str3v. **coderange** )  
end

def test\_plus\_valid  
assert\_equal(CODERANGE\_UNKNOWN, (@removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_UNKNOWN, (@str1v removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_UNKNOWN, (@str1.dup+@str2v ). **coderange** )  
assert\_equal(CODERANGE\_VALID, (@str1v +@str2v ). **coderange** )  
assert\_equal(CODERANGE\_VALID, (@removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_VALID, (@str1v removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_VALID, (@str1.dup+@str3v ). **coderange** )  
assert\_equal(CODERANGE\_VALID, (@str1v +@str3v ). **coderange** )  
end

def test\_plus\_7bit  
assert\_equal(CODERANGE\_UNKNOWN, (@removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_UNKNOWN, (@str3v removed\_email\_address@domain.invalid). **coderange** )  
assert\_equal(CODERANGE\_UNKNOWN, (@str3.dup+@str3v ). **coderange** )  
assert\_equal(CODERANGE\_7BIT, (@str3v +@str3v ). **coderange** )  
end  
end

---

<div class="post-metadata">

**Author:** ![NARUSES\_Yui](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/258eb7/32.png) [@NARUSES\_Yui](https://www.ruby-forum.com/u/NARUSES_Yui)\
**Post date:** [February 17, 2008, 10:38am UTC](https://www.ruby-forum.com/t/tests-for-coderange-information/225993/2 "2008-02-17T10:38:15Z")

</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:

> UTF-8 e$BJ8;z%+%&%s%H$N9bB.2=$rF~$l$F5$IU$$$?$N$G$9$,!"e(Br15519 e$B$^$G$Oe(B str1 +  
> str2 e$B$de(B str \* 3 e$BEy$Ge(B CODERANGE e$B$N\>pJs$,\>C\<:$7$F$$$^$7$?!#$3$l$O=$@5$7$?e(B  
> e$B$N$G$$$$$N$G$9$,!"8=:\_$OD\>$7$F$b%F%9%H$,$J$$$N$G$-$A$s$HD\>$C$F$$$k$+8e!9e(B

e$B$=$N=$@5$O4V0c$C$F$$$k$N$G$O$J$$$G$7$g$&$+!#e(B

e$B0J2\<$N$h$&$K!“e(B”\xa1\xa1" e$B$H$$$&@5$7$$e(B EUC-JP  
e$BJ8;zNs$,@8@.$5e(B  
e$B$l$?$H$-$G$be(B valid\_encoding? e$B$,??$K$J$i$J$$$h$&$K$J$C$F$$$^e(B  
e$B$9!#e(B

% ./ruby -ve ’  
s = “\xa1”.force\_encoding(“euc-jp”)  
p s.valid\_encoding?  
p((s + s).valid\_encoding?)’  
ruby 1.9.0 (2008-02-17 revision 15520) [i686-linux]  
false  
false

% ./ruby -ve ’  
s = “\xa1”.force\_encoding(“euc-jp”)  
p s.valid\_encoding?  
p((s\*2).valid\_encoding?)’  
ruby 1.9.0 (2008-02-17 revision 15520) [i686-linux]  
false  
false

---

<div class="post-metadata">

**Author:** ![NARUSES\_Yui](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/258eb7/32.png) [@NARUSES\_Yui](https://www.ruby-forum.com/u/NARUSES_Yui)\
**Post date:** [February 17, 2008, 12:15pm UTC](https://www.ruby-forum.com/t/tests-for-coderange-information/225993/3 "2008-02-17T12:15:14Z")

</div>

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

Tanaka A. wrote:

> e$B$l$?$H$-$G$be(B valid\_encoding? e$B$,??$K$J$i$J$$$h$&$K$J$C$F$$$^e(B  
> e$B$9!#e(B

e$B$"!\<!"e(BBROKEN + ? e$B$Oe(B UNKNOWN  
e$B$J$N$G$9$M!#D\>$7$F$\*$-$^$9!#e(B
