中文字符 unicode utf8 范围 字符编码笔记:ASCII,Unicode和UTF-8

public static final String CHINESE_GBK = ”u2E80-u2EFFu31C0-u31EFu3200-u32FFu3400-u4DBFu4E00-u9FBFuF900-uFAFF”;

unicode : u2E80-u2EFF

utf-8       : e2 ba 00->e2 eb bf

 

unicode :u31C0-u31EF

utf-8       : e3 87 80 -> e3 87 af

 

unicode :u3200-u32FF

utf-8       : e3 88 80 -> e3 87 bf

 

unicode :u3400-u4DBF

utf-8       : e3 a0 80 -> e4 87 bf

 

unicode :u4E00-u9FBF

utf-8       : e4 b8 80 -> e9 be bf

 

unicode :uF900-uFAFF

utf-8       : ef a4 80  -> ef ab bf

 

hiragana:平假名:

utf-8       : e3 81 80  -> e3 82 9f

public static boolean is Hiragana(String str){
  return charAllBetween(str, ’u3040′, ’u309F’);
 }

katagana:片假名

utf-8       : e3 82 a0  -> e3 83 bf

 public static boolean is Katagana(String str){
  return charAllBetween(str, ’u30A0′, ’u30FF’);
 }

 

UCS-4 range (hex.) UTF-8 octet sequence (binary) 

0000 0000-0000 007F 0xxxxxxx 

0000 0080-0000 07FF 110xxxxx 10xxxxxx 

0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx  

0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

0400 0000-7FFF FFFF 1111110x 10xxxxxx … 10xxxxxx 

 编码步骤: 

1) 首先确定需要多少个8bits(octets) 

2) 按照上述模板填充每个octets的高位bits 

3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x 

4) 解码的原理一样。  实例:(留意每个bit的颜色,粗体字为模板内容)  

UCS-4 UTF-8   HEX  BIN  Bytes  BIN  HEX   Bytes  

0000 000A  00001010      4  00001010 0A 1  

0000 0099  10011001      4  11000010 10011001 C2 99 2  

0000 8D99  10001101 10011001   4  11101000 10110110 10011001 E8 B6 99 3     

不知大家看懂了没有,其实不懂也无所谓,反正又不用自己算,程式可以完全代劳。    以UTF8格式储存的文件档首标识为EF BB BF。  

http://www.oschina.net/code/snippet_203297_8755

ConversionResult ConvertUTF8toUTF32 ( const UTF8*     *sourceStart
02                                    , const UTF8      *sourceEnd
03                                    , UTF32*          *targetStart
04                                    , UTF32           *targetEnd
05                                    , ConversionFlags  flags
06                                    )
07{
08    ConversionResult  result = conversionOK;
09    const UTF8       *source = *sourceStart;
10    UTF32            *target = *targetStart;
11    while (source < sourceEnd) {
12        UTF32 ch = 0;
13
14        // extraBytesToRead需要额外读取的字符数目
15        unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
16        if (source + extraBytesToRead >= sourceEnd) {
17            // 下一个字符超过了资源的末尾
18            result = sourceExhausted;
19            break;
20        }
21        /* Do this check whether lenient or strict */
22        if (!isLegalUTF8(source, extraBytesToRead+1)) {
23            // 非法字节序列
24            result = sourceIllegal;
25            break;
26        }
27        /*
28         * The cases all fall through. See ”Note A” below.
29         */
30        // 提高效率的方法: Duff’s Device
31        switch (extraBytesToRead) {
32        case 5: ch += *source++; ch <<= 6;
33        case 4: ch += *source++; ch <<= 6;
34        case 3: ch += *source++; ch <<= 6;
35        case 2: ch += *source++; ch <<= 6;
36        case 1: ch += *source++; ch <<= 6;
37        case 0: ch += *source++;
38        }
39        ch -= offsetsFromUTF8[extraBytesToRead];
40        // 注意,这时utf8才转换成utf32
41
42        if (target >= targetEnd) {
43            // 由于目标不够存储
44            // 让source回到原来的地方
45            source -= (extraBytesToRead+1); /* Back up the source pointer! */
46            result = targetExhausted;
47            break;
48        }
49        if (ch <= UNI_MAX_LEGAL_UTF32) {
50            /*
51             * UTF-16 surrogate values are illegal in UTF-32, and anything
52             * over Plane 17 (> 0x10FFFF) is illegal.
53             */
54            // utf16的逃逸字符??
55            if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
56                // 也是错误的utf8字节流
57                if (flags == strictConversion) {
58                    source -= (extraBytesToRead+1); /* return to the illegal value itself */
59                    result = sourceIllegal;
60                    break;
61                }
62                else { *target++ = UNI_REPLACEMENT_CHAR; }
63            }
64            else { *target++ = ch; }
65        }
66        else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
67            // 错误utf8字节流
68            result = sourceIllegal;
69            *target++ = UNI_REPLACEMENT_CHAR;
70            // 为什么这里完全不用判断呢??看看上面的if语句
71            // 我认为这里是一个bug
72        }
73    }
74    *sourceStart = source;
75    *targetStart = target;
76    return result;
77}

 

参考资料:

C实现:http://www.linuxso.com/sql/30162.html 

http://oknostar.blog.163.com/blog/static/29436186201121712953374/

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

http://www.pconline.com.cn/pcedu/empolder/gj/other/0505/616631.html

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>