编码

做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. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  2. 云服务器上搭建cobalt strike遇到的一些小问题

    一.前言: 当你兴高采烈的买了一台云服务器,迫不及待地想去搭建传说中的神器cobalt strike的时候,你可能会遇到以下的一些小问题,这里我会列出对应的解决方法. 二.遇到的一些小问题 1.上传文 ...

  3. 「学习笔记」单调队列优化dp

    目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...

  4. HCNP Routing&Switching之DHCP安全

    前文我们了解了MAC地址防漂移技术,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16632239.html:今天我们来了解下DHCP安全相关话题: 回顾DHC ...

  5. django_day05

    django_day05 内容回顾 内容回顾 对应关系 类-------表 对象-----数据行 属性------字段 django使用mysql数据库流程 创建一个mysql数据库 在setting ...

  6. 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐

    ​ 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...

  7. 【Android 逆向】ARM CPP 类对象

    #include <stdio.h> class aclass{ private: int m; char c; public: aclass(int i, char ch) { prin ...

  8. React版/Vue版都齐了,开源一套【特别】的后台管理系统...

    本项目主要基于Elux+Antd构建,包含React版本和Vue版本,旨在提供给大家一个简单基础.开箱即用的后台管理系统通用模版,主要包含运行环境.脚手架.代码风格.基本Layout.状态管理.路由管 ...

  9. LFS(Linux From Scratch)构建过程全记录(三):下载所需的软件包

    写在前面 本文将记录构建LFS的过程中,下载软件包的全过程 准备下载的路径 注意请确保$LFS已经设置完毕 我们需要创建一个文件夹,地址为$LFS/sources,用于保存对应的源码 输入的指令如下: ...

  10. kali2020.1修改root密码,以最高权限登录系统

    普通用户权限登录系统 sodu su切换为root权限 passwd root 按提示输入密码 再次输入密码 更新密码 右上角点切换用户 root/xxxx 更改成功,下面公布操图片