编码

做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. Flutter 检测报错 Unable to locate Android SDK.

    安装好 Flutter SDK 之后,官方建议使用flutter doctor检查 Flutter SDK 的相关配置信息. 如果 Android Studio 安装 Android SDK 的时候选 ...

  2. 关于Copy On Write Array List,你会安全使用么

    摘要:JDK中提供了CopyOnWriteArrayList类,简称COW.为了将读取的性能发挥到极致,CopyOnWriteArrayList读取是完全不用加锁的,并且更厉害的是:写入也不会阻塞读取 ...

  3. 聊天机器人框架Rasa资源整理

      Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性.参考文献收集了一些Rasa相关的开源项目和优质文章. 一.Rasa介绍 1.R ...

  4. [HNOI2011]卡农 (数论计数,DP)

    题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...

  5. windows10/11高性能模式开启

    大部分用户windows10和11高性能模式都被隐藏了 并且没有隐藏选项我们如何开启呢如下 win+R如下 打开运行-输入cmd进入后输入代码如下 powercfg -SETACTIVE 8c5e7f ...

  6. 【manim】3b1b的"Almost" Fourier Transform复刻

    最近在做Fourier Transform的内容,记录一下今天下午的成果. 本文代码全部自行编写,需要math and music项目完整工程可以在gayhub上获取.(现在还没弄完,就先不发了.) ...

  7. 【三维地图】开发攻略 —— 详解“GeoJSON”技术和应用场景

    GeoJSON ,一个用于存储地理信息的数据格式.GoeJSON对象可以表示几何.特征或特征集合,支持:点.线.面.多点.多线.多面和几何集合.在基于平面地图,三维地图中都需要用到的一种数据类型. 由 ...

  8. SSH免密登录的配置

    ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录(免密) 大部分情况我们选择都是输入密码登录,平常使用暂时没有遇到什么问题.最近我编写了一些使用scp来传输文件的脚本,每一次scp都需要输 ...

  9. .NET使用StackTrace获取方法调用者信息

    前言 在日常工作中,偶尔需要调查一些诡异的问题,而业务代码经过长时间的演化,很可能已经变得错综复杂,流程.分支众多,如果能在关键方法的日志里添加上调用者的信息,将对定位问题非常有帮助. 介绍 Stac ...

  10. 记一次 .NET 某数控机床控制程序 卡死分析

    一:背景 1. 讲故事 前段时间有位朋友微信上找到我,说它的程序出现了卡死,让我帮忙看下是怎么回事? 说来也奇怪,那段时间求助卡死类的dump特别多,被迫训练了一下对这类问题的洞察力 ,再次声明一下, ...