编码

做Web的同学,最开始一定遇到过乱码问题,工作这么久,一定听说过Unicode, GB2312等编码。典型的记事本选择的四种选项:ANSI,Unicode,Unicode big endian,UTF-8,有没有疑惑,这都是些什么鬼???

什么是编码?

众所周知,计算机存储都是0和1,那计算机是如何区分开汉字,字母呢?后来人们就规定了一个编码表,这个表就相当于一个字典,比如我们通俗约定1100001就表示A,1100002表示B做计算机显示的时候,发现一个字符对象存储的值是1100001那就显示A就行了。像这样,由信息的一种形式转换为另外一种形式的过程,称为编码。而编码表便是编码过程的一种规则。

ASCII

ASCII(American Standard Code for Information Interchange)是最出名也是最基本的编码表,最开始计算机发明的时候,计算机的使用一般都是一些特殊字符加上26个字母,因此美国人定制了ASCII表用来显示通用的26个字符加上一些特殊字母,ASCII码只占用一个1字节。

ANSI

最开始ASCII编码是够用的,但是随着计算机的发展,越来越多的国家陆续用上了计算机,这个时候,母语非英语的国家就开始不满意了,ASCII只能表示26个英文字母,那法语(é),汉语(中国),德语(Ä ä)等也要在计算机中表示,于是最开始,每个国家都自己定义了一套关于自己的编码规则,其中比较出名的有:

  • 西欧 ISO 8859-1

  • 中国国标 GB 2312

  • 台湾同胞的繁体 Big 5

  • 日本 Shift_ JIS

这些都是编码都是在原有的ASCII基础上扩展而来,统称为ANSI编码。但是最大的缺点就是互不兼容,也就是每个编码都是在没有考虑其他国家的定义的基础上扩展的。一边来说,在解码/编码过程中,都是指定具体的编码,比如GBK2312ISO 8859-1 等,ANSI只是对上述编码的一种统称。使用ANSI来作为一种编码格式的一般只见于Windows自带的记事本中。而在Windows记事本中,不同语言的操作系统,记事本所指的ANSI是不同的,

  • 简体中文 GBK
  • 日文 Shift_JIS
  • 繁体中文 Big 5
  • ...

因此,对于Windows的记事本,ANSI需要看具体的编码。

UNICODE

首先需要明确的是UNICODE是将字符集编码方式分开的一种方案,在维基百科中又被称做万国码、国际码。由名字便可知道,Unicode统一了各个国家的字符并规定了每个符号的编码,在Unicode字符集中,每个字符占用两个字节表示。ANSI类的字符集合编码都是一对一的关系,一种字符集对应一种编码。在Unicode编码中,Unicode编码的实现方式被称为Unicode转换格式Unicode Transformation Format,简称为UTF):代表性的有以下几种:

  • UTF-8: 前面说得到,Unicode字符集是以2个字节表示一个字符,但是在有时候只需要ASCII编码即可完整表示所有内容的系统中,使用Unicode会浪费比较多的控件,因此出现了UTF-8编码,UTF-8 是一种变长编码。UTF-8在编码Unicode码的时候,会将小位数的字符进行压缩,因此使用UTF-8的表示一个字母的时候,依然只使用一个字节。UTF-8对常用的字符一般3个字节即可表示,最多6个字节。(尽管如此,2003年11月UTF-8RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000U+10FFFF,也就是说最多四个字节:维基百科
  • UTF-16: UTF-16使用16位作为一个字长单位,使用UTF-16要么是两个字节表示一个字符,要么是4个字节。不过值得注意的是不同的操作系统读取直接的顺序不同,就好像古人写字是从右往左写一样,这里顺序,称为字节序,比如1122,有些系统读出来是1122,而有些系统读出来是2211,所以UTF-16又分大端(utf16-big endian)和小端(utf16-little endian)表示。

关于为什么UTF-8 没有字节序的问题,感兴趣的同学可以看看为什么 UTF-8 不存在字节序的问题? - 孙笑凡的回答 - 知乎

说到这里,大概就能分清UNICODE,ANSI,UTF-8,GBK编码了,但是可能有的同学比较疑惑的是Windows自带的笔记本为什么会有个Unicode编码选项??这算是Windows混用概念问题,在Windows自带笔记本下的Unicode表示的是“Unicode”(对应UTF-16 LE)、“Unicode big endian”(对应UTF-16 BE

URLEncoding

URLEncoding又称为百分号编码,其主要作用在于解决在使用url中混合其他编码的时候所带来的语法冲突,比如?在URL中,表示参数分割,但是如果想要在参数中传递就必须通过特殊的转换,而URLEncoding则正是用来将这些特殊符号转换为其他不会有歧义的统一编码。

其主要编码原理在于:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

部分特殊字符转换规则如下:

空格 ! # $ % + @ : = ?
%20 %21 %23 %24 %25 %2B %40 %3A %3D %3F

一般当参数会混合在URL中,都会先将参数进行URL编码再进行传递。比如Get请求,或者HTTPMIME类型为application/x-www-form-urlencoded的请求

~~

微信搜索:StackTrace,一起学习,一起讨论,一起进步

Java 编码那些事(一)的更多相关文章

  1. Java 编码那些事(二)

    建议先阅读:Java 编码那些事(一) 现在说说编码在Java中的实际运用.在使用tomcat的时候,绝大部分同学都会遇到乱码的问题,查查文档,google一下解决方案啥的,都是设置这里,设置那里,或 ...

  2. Java编码规范

    1. Java命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写.1.1 一般概念 n 尽量使用完整 ...

  3. Java的哪些事

    Java的哪些事--------------------------------------------------Java学习分2个方面: Java语法与Java类库 Java: A simple, ...

  4. 10个精妙的Java编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  5. 你知道吗?10个精妙的 Java 编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  6. java编码过滤器

    1.java编码过滤器的作用: java过滤器能够对目标资源的请求和响应进行截取,过滤信息执行的优先级高于servlet. 2.java过滤器的使用: (1)编写一个普通的java类,实现Filter ...

  7. java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...

  8. 资料推荐--Google Java编码规范

    之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然这篇文章的 ...

  9. Eclipse formater(google Java 编码规范)

    1. 谷歌Java编码规范 http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 2. 下载配置文件: https://co ...

随机推荐

  1. 获取jdbc中resultSet结果集的大小

    当我们执行完一条Sql语句,获取到一个 ResultSet 对象后,有时我们需要立即知道到底返回了多少个元素,但是 ResultSet 并没有提供一个 size() 方法 or length 的属性, ...

  2. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  3. 轻量级RTSP服务和内置RTSP网关有什么不同?

    好多开发者疑惑,什么是内置RTSP网关,和轻量级RTSP服务又有什么区别和联系?本文就以上问题,做个简单的介绍: 轻量级RTSP服务 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的 ...

  4. Dubbo本地调试

    dubbo 启动标志 Dubbo service server started <dubbo:reference id="transferTimingUploadHisRPCServi ...

  5. linux 运维有趣的实用工具

    1.实时监控磁盘 IO-IOTop IOTop 命令是专门显示硬盘 IO 的命令, 界面风格类似 top 命令. [root@localhost ~]# yum -y install iotop` 2 ...

  6. 选择排序C语言版本

    算法思路,从头至尾扫描序列. 首先从第二个到最后,找出最小的一个元素,和第一个元素交换: 接着从第三个到最后,后面找出最小的一个元素,和第二个元素交换: 依次类推最终得到一个有序序列. void Se ...

  7. Exchange 2019数据库切换

    最近在测试Exchange 2019的一些安装步骤.在测试到DAG的数据库切换的时候遇到了一些问题.An Active Manager operation failed. Error: The dat ...

  8. 《Java笔记——基础知识点》

    Java笔记--基础知识点       位运算符操作的都是整型的数据. 位运算符是直接对整数的二进制进行计算. 整数不能进行逻辑运算. 运算符优先级别由高到低分别是:() > ! > 算术 ...

  9. 在 CentOS 8 上使用 FirewallD 设置防火墙

    简介 一个 Linux 防火墙可用于保护您的工作站或服务器免受不需要的流量干扰.您可以设置规则来阻止或允许流量通过.CentOS 8 带有一个动态的.可定制的基于主机的防火墙和一个 D-Bus 接口. ...

  10. PAT (Basic Level) Practice 1010 一元多项式求导 分数 25

    设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. 输出格式: ...