eca2e805a034e78980cac438b98690856689db2f
[chise/ruby.git] / chise / utf8.rb
1 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
2
3 module CHISE
4   module UTF8Value
5     def u8toi(str)
6       raise if str.nil?
7
8       i = 0
9       len = str.length
10
11       raise unless 1 <= len
12
13       c = str[i]
14       i += 1
15
16       if ( c < 0xC0 )
17         cid = c
18         counter = 0
19       elsif ( c < 0xE0 )
20         cid = c & 0x1f
21         counter = 1
22       elsif ( c < 0xF0 )
23         cid = c & 0x0f
24         counter = 2
25       elsif ( c < 0xF8 )
26         cid = c & 0x07
27         counter = 3
28       elsif ( c < 0xFC )
29         cid = c & 0x03
30         counter = 4
31       else
32         cid = c & 0x01
33         counter = 5
34       end
35
36       if (counter + 1 <= len)
37         (0...counter).each {|j|
38           cid = (cid << 6) | (str[j + i] & 0x3F)
39         }
40         return cid
41       end
42
43       raise
44     end
45
46     def itou8(cid)
47       raise unless cid.kind_of?(Integer)
48       if (cid <= 0x7F)
49         return ""+cid.chr
50       elsif (cid <= 0x7FF)
51         dest = "  "
52         dest[0] = (cid >> 6) | 0xC0
53         dest[1] = (cid & 0x3F) | 0x80
54         return dest
55       elsif (cid <= 0xFFFF)
56         dest = "   "
57         dest[0] =  (cid >> 12) | 0xE0
58         dest[1] = ((cid >>  6) & 0x3F) | 0x80
59         dest[2] =  (cid        & 0x3F) | 0x80
60         return dest
61       elsif (cid <= 0x1FFFFF)
62         dest = "    "
63         dest[0] =  (cid >> 18) | 0xF0
64         dest[1] = ((cid >> 12) & 0x3F) | 0x80
65         dest[2] = ((cid >>  6) & 0x3F) | 0x80
66         dest[3] =  (cid        & 0x3F) | 0x80
67         return dest
68       elsif (cid <= 0x3FFFFFF)
69         dest = "     "
70         dest[0] =  (cid >> 24) | 0xF8
71         dest[1] = ((cid >> 18) & 0x3F) | 0x80
72         dest[2] = ((cid >> 12) & 0x3F) | 0x80
73         dest[3] = ((cid >>  6) & 0x3F) | 0x80
74         dest[4] =  (cid        & 0x3F) | 0x80
75         return dest
76       else
77         dest = "      "
78         dest[0] =  (cid >> 30) | 0xFC
79         dest[1] = ((cid >> 24) & 0x3F) | 0x80
80         dest[2] = ((cid >> 18) & 0x3F) | 0x80
81         dest[3] = ((cid >> 12) & 0x3F) | 0x80
82         dest[4] = ((cid >>  6) & 0x3F) | 0x80
83         dest[5] =  (cid        & 0x3F) | 0x80
84         return dest
85       end
86     end
87   end
88 end