常用的能够保存汉字的编码表有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. COM笔记-COM库函数

    COM在OLE32.DLL和 OLE32.LIB定义了一些常用的函数.在使用这些函数前要先调用CoInitialize来初始化COM库.当进程不再需要使用COM库函数时要调用CoUninitializ ...

  2. C++泛型编程之类模板

    泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...

  3. 【转载】vim 中文帮助手册的安装

    本文出处http://hi.baidu.com/bkhcvzdvmjfkpyr/item/9c238224c1a69498b6326360 vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅 ...

  4. springboot:嵌套使用异步注解@Async还会异步执行吗

    一.引言 在前边的文章<[springboot:使用异步注解@Async的那些坑>中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误. 二.代码演示 下 ...

  5. 如何从 vue-element-admin 迁移到 Fantastic-admin

    // FIXME 链接更新 如果你还不知道 Fantastic-admin 是什么,那么我先用几张预览图给大家了解一番. 看来预览图,如果你感兴趣,可以点这里来详细了解并试用,这是一款完成度极高,开箱 ...

  6. servlet+Ajax开发web工程

    前言 因为目前基本已经不会再用到servlet+jsp开发项目了,基本都是使用框架来开发:我们常用的框架都是基于servlet来封装的,该阶段只需要了解一下tomcat如何使用,servlet的生命周 ...

  7. 已知三角形ABC为锐角三角形,求 sinA + sinB·sin(C/2) 的最大值。

    已知三角形ABC为锐角三角形,求 sinA + sinBsin(C/2) 的最大值. 解:Δ := sinA + sinB·sin(C/2) = sin(B+C) + sinB·sin(C/2) = ...

  8. 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹

    在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...

  9. Python - 导入的位置

    导入的是什么 导入是将 Python 的一些功能函数放到当前的脚本中使用 不导入的功能无法直接在当前脚本使用(除了 python 自带的内置函数) Python 有很多第三方功能,假设想要使用,都必须 ...

  10. Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题

    问题背景 app.run() 添加了 host.port.debug 参数,运行后发现没有生效,咋肥事! 解决方案 要打开 debug 模式的话,勾选 FLASK_DEBUG 就好啦 再次运行,发现已 ...