UTF-8和Unicode编码
常用的能够保存汉字的编码表有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解决这个问题的思路是能用一个字节表示的就用一个字节,一个字节不够的,再用两个字节。
规定:
如果一个字符只占用一个字节,那么这个字节的第一位就必须为0。
0xxx xxxx
如果一个字符占用了两个字节,那么高八位前两位必须都为1、第三位为0。低八位前两位必须为10。
110x xxxx 10xx xxxx
如果一个字符占用了三个字节,那么高八位前三位必须是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编码的更多相关文章
- ascii、unicode、utf、gb等编码详解
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...
- 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为 ...
- Unicode编码,解释UCS、UTF、BMP、BOM等名词
(转载 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...
- [转]程序员趣味读物:谈谈Unicode编码
from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...
- java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码
随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题 ...
- unicode编码与utf-8 区别
unicode编码与utf-8 区别 如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中: 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码.[1] ...
- [百度空间] [转]程序员趣味读物:谈谈Unicode编码
出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...
- 了解Unicode编码
制定Unicode编码标准的组织有两个,一个是国际标准化组织ISO,一个是多语言软件制造商组成的统一码联盟. 通用字符集UCS(Universal Character Set)是由ISO制定的编码方案 ...
- php汉字转Unicode编码函数
/** * $str 原始字符串 * $encoding 原始字符串的编码,默认GBK * $prefix 编码后的前缀,默认"&#" * $postfix 编码后的后缀, ...
随机推荐
- QT 自定义控件 以及信号和槽的使用
自定义login 控件 Login头文件 #ifndef LOGIN_H #define LOGIN_H #include <QWidget> namespace Ui { class L ...
- 12.SpringMVC之拦截器
1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...
- Python中的reduce()函数
reduce()函数也是Python内置的一个高阶函数.reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收 ...
- session.flush与transaction.commit
以session的save方法为例来看一个简单.完整的事务流程,如下是代码片段: ---------------------------- Session session = sessionFacto ...
- x和y为正整数变量,求满足 x+y | xy 的通解。
x和y为正整数变量,求满足 x+y | xy 的通解. 解:由题设可知存在正整数t满足t(x+y)=xy. 设m=(x,y),则存在正整数u和v满足: x=mu, y=mv, (u,v)=1. 于是有 ...
- JavaScript——数组——数组长度
JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...
- MySQL密码重置方法
MySQL数据库的安装和配置,配置Mysql按照bin目录到Path中 使用命令行窗口连接MYSQL数据库:mysql –u用户名 –p密码 对于密码的重置有以下两种方法(卸载重新安装当然也可以): ...
- How to check type of files without extensions in python? 不通过文件扩展名,怎样知道文件类型?
有一个命令 file 可以用 $ file fuck fuck.png: PNG image data, 1122 x 750, 8-bit colormap, non-interlaced pyth ...
- Microsoft Remote Desktop 通过 .rdp 文件登录
最近在淘宝上买了「市场洞察」子账号,说是子账号,其实是需要登录到他们的 Windows 服务器上才能用的.并且子账号也是 5-6 个人共用的,且不说远程服务器很老又有延迟,经常是我想添加一个监控店铺或 ...
- 从一个跨二十年的glibc bug说起
1. 缘起 这几天调gcc 7.5.0 +glibc 2.23的交叉编译工具链,由于gcc 7.5.0的默认打开Werr,偶然发现了glibc一个隐藏了二十年的世纪大bug. 这个bug在glibc ...