• [原]utf8编码


    utf8编码

    关于编码问题:

    首先需要知道什么是编码为什么要编码, 计算机只能存储一个字节一个字节的二进制信息,所以需要把人可读的这些文字用唯一的方式在计算机内部表示出来, 但是表示的方法不唯一;

    例如英文字符 就那么点 所以一个字节 也就是 8个二进制位就能给所有的进行编码,最多能给256个符号编码; 但是ASCII 编码实际只使用了 7位 所以最多编码 128个字符。

    但是汉字就不行了, 常用的汉字大概6000多个, 所以 至少需要两个字节, 所以中国government给出了两个字节的编码方案, 叫做GBxxxx (国标的意思)

    两个字节16位 最多 有65536 个字符, 所以 给这些汉字用是足够了,但是有个问题 如何让GB码和ASCII码互相兼容, 即这65536 个字符里面关于那些英文字符的编码 在GB码和ASCII码中要一致

    方法很简单 要求所有最高位为0的编码表示的是ASCII码, 最高位为1的编码是GB码;

    这样实际最多就只能表示32768个汉字了;

    但是GB国标码只能在中国用, 世界人民怎么办呢?世界有那么多的语言,每种语言都应该有编码 所以有了一个叫做unicode 统一编码的东西出现了;Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符(见百度百科http://baike.baidu.com/view/40801.htm)

    当然最后还有一个我们经常见到的UTF8编码, 这个是什么东西?

    UTF全称 是Unicode Transformation Format 即unicode 编码的变形形式;

    unicode编码是定长度的, 但是对于ASCII字符来讲 有点浪费了, 可以用一个字节表示 ASCII字符, 用多个字节表示 汉字什么的, 这就是变长度编码方式了, 那就需要对unicode编码进行一些变形;



    UTF-8的定义:

    0开头 latin字符
    10开头 一个字符连续字节中的某一个
    1111xxx 一个多字节字符的开始  前导1的个数表示字节个数 前导1后面紧跟一个0

    汉字一般3个字节

    unicode是统一编码
    utf8是对unicode的转换编码

    unicode    utf8
    0xxxxxxx -> 0xxxxxxx   latin 转化成自身
    00000yyy  yyxxxxxx  -> 110yyyyy  10xxxxxx  两字节 转化成 两字节
    zzzzyyyy  yyxxxxxx->1110zzzz 10yyyyyy 10xxxxxx  两字节转化成三字节(一般汉字就是如此)
    000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx 三字节转化成4字节

    作者:liyong748 发表于2012/5/10 23:09:16 原文链接
    阅读:1005 评论:1 查看评论
  • 相关阅读:
    json转List、Map
    java复制文件的4种方式
    Java并发编程之CountDownLatch的用法
    SpringMVC整合ActiveMQ
    Spring AOP (事务管理)
    Spring AOP 的实现方式(以日志管理为例)
    Java设计模式之模板方法模式(Template Method)
    MongoDB简介
    线程池的实现原理
    ReentrantLock的底层实现机制 AQS
  • 原文地址:https://www.cnblogs.com/liyonghelpme/p/4273580.html
Copyright © 2020-2023  润新知