常用的能够保存汉字的编码表有UTF-8、GBK等。需要注意,无论文件使用的是什么编码格式,读取到Java程序中,所有的字符都是用Unicode编码表示(Java中所有的字符内容都使用char类型表示,一个char代表16位、2Byte无符号Unicode码值)。

Unicode表示的范围比UTF-8要大,但是Unicode只需要2字节,而UTF-8最多可能需要3字节,GBK一个汉字占2Byte,UTF-8一个汉字占3Byte

UTF-8主要解决了传输过程中资源的浪费。

传输的是一些英文字母、阿拉伯数字等内容,但是由于Unicode的规定,所有的字符都固定用2字节表示。英文字母、阿拉伯数字这些本来用一个字节就可以表示出来的字符也需要使用两个字节表示。这样就会造成资源浪费。

例如

Unicode编码 二进制表示
f \u0066 00000000 01100110
l \u006c 00000000 01101100
o \u006f 00000000 01101111
w \u0077 00000000 01110111
e \u0065 00000000 01100101
r \u0072 00000000 01110010
\u662f 01100110 00101111
1 \u0031 00000000 00110001
\u6735 01100111 00110101
\u82b1 10000010 10110001

我们可以看出对于英文与阿拉伯数字,其高8位全为0,会极大的浪费空间。

UTF-8解决这个问题的思路是能用一个字节表示的就用一个字节,一个字节不够的,再用两个字节。

规定:

  1. 如果一个字符只占用一个字节,那么这个字节的第一位就必须为0。

    0xxx xxxx

  2. 如果一个字符占用了两个字节,那么高八位前两位必须都为1、第三位为0。低八位前两位必须为10。

    110x xxxx 10xx xxxx

  3. 如果一个字符占用了三个字节,那么高八位前三位必须是111,第四位是0。中八位和低八位前两位都是10。

    1110 xxxx 10xx xxxx 10xx xxxx

假设从某个文件中读取出如下字节串:

11011010 10110010 01101101 11101111 10010010 10101010

根据UTF-8的规则,就可以把它识别为:

-- -- --
11011010 10110010 01101101 11101111 10010010 10101010
双字节 单字节 三字节
11010 110010 1101101 1111 010010 101010

识别时候将标识位(我也不知道具体叫啥)去掉,也就是前面的0,110,1110

也就是将如上表格的第二行的黑体字去掉,于是变成了第四行

对于如上的“flower是1朵花”,例如“是”则将二进制表示拼接进1110 xxxx 10xx xxxx 10xx xxxx中,并且从低位开始,高位补0

二进制表示 UTF-8编码
f 00000000 01100110 01100110
l 00000000 01101100 01101100
o 00000000 01101111 01101111
w 00000000 01110111 01110111
e 00000000 01100101 01100101
r 00000000 01110010 01110010
01100110 00101111 11100110 10011000 10101111
1 00000000 00110001 00110001
01100111 00110101 11100110 10011100 10110101
10000010 10110001 11101000 10001010 10110001

在将来解析的时候

判断若开头是0,则表示是一个字节组成;

若开头是1110,则表示是由三个字节组成,并且把标识位(就那个1110 xxxx 10xx xxxx 10xx xxxx的1与0)去掉,

剩下的拼接成一个二进制字符串,然后再将其转化成16进制,则成为Unicode编码

UTF-8和Unicode编码的更多相关文章

  1. ascii、unicode、utf、gb等编码详解

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...

  2. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  3. 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为 ...

  4. Unicode编码,解释UCS、UTF、BMP、BOM等名词

    (转载 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  5. [转]程序员趣味读物:谈谈Unicode编码

    from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...

  6. java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码

    随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题 ...

  7. unicode编码与utf-8 区别

    unicode编码与utf-8 区别 如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中: 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码.[1] ...

  8. [百度空间] [转]程序员趣味读物:谈谈Unicode编码

    出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...

  9. 了解Unicode编码

    制定Unicode编码标准的组织有两个,一个是国际标准化组织ISO,一个是多语言软件制造商组成的统一码联盟. 通用字符集UCS(Universal Character Set)是由ISO制定的编码方案 ...

  10. php汉字转Unicode编码函数

    /** * $str 原始字符串 * $encoding 原始字符串的编码,默认GBK * $prefix 编码后的前缀,默认"&#" * $postfix 编码后的后缀, ...

随机推荐

  1. 使用DOM方法来遍历一个文档

    问题 你有一个HTML文档要从中提取数据,并了解这个HTML文档的结构. 方法 将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作.示例代码: File input = n ...

  2. spring学习日志四

    一.spring对JDBC的支持 JdbcTemplate 简介 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. 作为 ...

  3. 读《深入理解java虚拟机》小结

    之所以学习 jvm ,是因为在学习多线程相关知识时,对 volatile 关键字理解的不够透彻,总有种似懂非懂的感觉.于是通过在网上各种资料的查阅,最终将 volatile 和 jvm 联系上了,本身 ...

  4. HTTP系列之:HTTP中的cookies

    目录 简介 cookies的作用 创建cookies cookies的生存时间 cookies的权限控制 第三方cookies 总结 简介 如果小伙伴最近有访问国外的一些标准网站的话,可能经常会弹出一 ...

  5. 什么是云效持续集成?如何关联Jenkins进行持续集成?

    什么是云效持续集成?如何关联Jenkins进行持续集成?云效流水线 Flow是一款企业级.自动化的研发交付流水线, 提供灵活易用的持续集成.持续验证. 持续发布功能,帮助企业高质量.高效率的交付业务. ...

  6. IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流

    因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...

  7. 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法

    最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...

  8. MySQL实战45讲(21--25)-笔记

    21 | 为什么我只改一行的语句,锁这么多? 加锁规则里面:包含了两个"原则".两个"优化"和一个"bug". 原则 1:加锁的基本单位是 ...

  9. Windows下安装程序时提示未安装Microsoft Net FrameWork 2.0

    问题描述 安装程序时碰到如下: 现在基本都是用win7.win10系统,缺少环境大多数都是因为系统没有启用. 解决方法 控制面板 - 程序 - 启用或关闭Windows功能 - 把第一项'NET Fr ...

  10. Baidu初试题分享(Java高级工程师)

    [特别声明:文章仅用来借鉴学习,不用于其他商业化活动] 1.JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库.通过JDK开发人员将源 ...