Java 编码那些事(一)
编码
做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
编码。但是最大的缺点就是互不兼容,也就是每个编码都是在没有考虑其他国家的定义的基础上扩展的。一边来说,在解码/编码过程中,都是指定具体的编码,比如GBK2312
,ISO 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-8
被RFC 3629
重新规范,只能使用原来Unicode
定义的区域,U+0000
到U+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请求,或者HTTP
中MIME
类型为application/x-www-form-urlencoded
的请求
~~
微信搜索:StackTrace,一起学习,一起讨论,一起进步
Java 编码那些事(一)的更多相关文章
- Java 编码那些事(二)
建议先阅读:Java 编码那些事(一) 现在说说编码在Java中的实际运用.在使用tomcat的时候,绝大部分同学都会遇到乱码的问题,查查文档,google一下解决方案啥的,都是设置这里,设置那里,或 ...
- Java编码规范
1. Java命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写.1.1 一般概念 n 尽量使用完整 ...
- Java的哪些事
Java的哪些事--------------------------------------------------Java学习分2个方面: Java语法与Java类库 Java: A simple, ...
- 10个精妙的Java编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- 你知道吗?10个精妙的 Java 编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- java编码过滤器
1.java编码过滤器的作用: java过滤器能够对目标资源的请求和响应进行截取,过滤信息执行的优先级高于servlet. 2.java过滤器的使用: (1)编写一个普通的java类,实现Filter ...
- java中文乱码解决之道(四)-----java编码转换过程
前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...
- 资料推荐--Google Java编码规范
之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然这篇文章的 ...
- Eclipse formater(google Java 编码规范)
1. 谷歌Java编码规范 http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 2. 下载配置文件: https://co ...
随机推荐
- 常用类--String
一.String 1.1 String是不可变对象 String的底层是一个 char类型字符数组 String类是final修饰的,不能被继承,不能改变,但引用可以重新赋值 String采用的编码方 ...
- python数据精度问题
一.python运算时精度问题: 1.运行时精度问题在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和十进制之间对应问题会导致数值的精度问题,比如无法用有限个 ...
- CodeForces - 1701C
Problem - C - Codeforces 题意: 每个位置对应一种适合的工人,适合的工人工作消耗1h,不适合2h,每个工人不能同时工作多个机器,问将所有机器工作完毕的最小时间是多少. 题解: ...
- 图解Kubernetes的Pod核心资源-来白嫖啊
目录 一.Pod定义 二.Pod入门yaml描述文件 三.共享NetworkNamespace 四.共享PID 五.容器生命周期 六.初始化容器 6.1.简介 6.2.与普通容器的区别 6.3.实验 ...
- SpringMVC--从理解SpringMVC执行流程到SSM框架整合
前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...
- vue项目中使用百度富文本编辑器ueditor
第一步,安装依赖,并且把ueditor整个文件夹放入public里边 第二步,在你需要编辑的地方引入,或者main.js中全局引入 XX.vue文件中写入下面代码,创建编辑器. <vue-ued ...
- KubeOperator界面,集群详情中的存储,存储提供商
点击"添加",假设选择的类型是rook-ceph,表示的是在这个k8s集群里创建rook-ceph集群,而不是显示已经存在的集群 意味着可以使用这种办法在k8s集群里创建rook- ...
- TCP服务端收到syn但是不回复syn ack问题分析
文章转载自:https://blog.csdn.net/jueshengtianya/article/details/52130667 最近在分析客户的一个问题时遇到了一种奇怪的情况,客户在服务端开启 ...
- CentOS yum如何安装php7.4
centos系统下使用yum安装php7.4正式版,当前基于WLNMP提供的一键安装包来安装 1.添加epel源 yum install epel-release 2.添加WLNMP一键安装包源 rp ...
- Spring mvc源码分析系列--Servlet的前世今生
Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...