字符编码详解

原创 2016年08月29日 01:05:54

My Blog:http://muchstudy.com
原文地址:http://muchstudy.com/2016/08/26/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E8%AF%A6%E8%A7%A3/

  经常有人问,为啥出来乱码呢?要么是前端浏览器显示乱码,要么是后台服务器接收是乱码。前两天又碰到一哥们儿来问我这问题!那么,今天就来聊聊字符编码。

一、字符编码要解决什么问题?

  就一句话,解决二进制与字符相互转换的问题!够直白吧!

二、字符编码是如何工作的?

  以ASCII编码为例,规定以一个字节来表示一个字符,一个字节8位(11111111),一共可以表示256个字符,目前只用到0-127号。

ASCII码表

  有了这个规则,那么字符在网络间传输时就可以按照这个规则进行编码解码。

编码解码过程

  上图是以一个大写的字符A为例,基于ASCII编码字符集的编码解码过程。

三、各种字符编码间是何种关系?

  谈到字符编码,就会有人问UTF-8GB2312到底啥关系,跟ASCII编码又是啥关系?
  还是一句话,他们相互间无直接关系!
  解释一下,可以简单粗暴的理解为每一种字符编码对应于一种语言字符与二进制间的转换Map关系,最终形成一个字符集。当初设计的时候,只考虑到英文字符,用ASCII绰绰有余。但是后来碰到日文字符、中文字符、阿拉伯语字符等当然就不好使了,而且对于汉字来讲,有上万个字符,一个字节8位显然无法完全表示这么多个汉字字符。这个时候当然需要设计新的字符编码规则来解决不同语言编码的问题。紧接着,世界上的语言那么多种类,如果大家都各自为自己的设计一套,那岂不是很难管理,所以就整出个Unicode来统一标准。
  这里的无直接是指一些编码规则保留了前面127位与最早的ASCII编码相兼容。这也是为什么大部分时候只有中文出现乱码,而英文字符能正常使用的原因。

这里有两篇文章帮助理解:
1. 字符编码笔记:ASCII,Unicode和UTF-8
2. ASCII、Unicode、GBK和UTF-8字符编码的区别联系

四、浏览器跟服务器是如何勾搭上的?

  当然,要想勾搭上,当然得先有暗号!这样才能暗送秋波。不然两边各自讲相互听不懂的语言当然就无法沟通。

名称 说明 样例
Accept-Charset 客户端告诉服务器接收哪种字符编码 Accept-Charset:utf-8,is0-8859-1;1=0.8,q表示优先级,1最高
charset 告诉接收者传输内容使用何种字符编码,这里的接收者既可以是服务器端也可以是客户端 Content-Type: text/html;chart=utf-8

  上面是通过HTTP头信息设置编码规则,还可以在页面上设置编码规则
HTML中:

<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-2022-jp">
  <META LANG="jp">
  <TITLE>A Japanese Document</TITLE>
</HEAD>

JSP中:

<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8"%>  

JQuery ajax自动设置Content-Type:
  在http://v3.bootcss.com/的console里运行$.ajax({url:"/ajaxDemo",type:"post",data:{name:"YiYing"},success:function(){}}),发起的ajax请求如下图所示:

请求头信息

jquery 源码:

jquery源码

五、造成乱码的原因

  查了一下RFC文档,Content-Type的默认值为Content-Type: text/plain; charset=us-ascii。如果客户端的字符A以ASCII编码,最终在网络中传输的是二进制的65。如果服务器以另外一种编码规则解码(这个时候恰好未兼容ASCII),那么通过65解码出来的字符就不是字符A,而是其它字符了,从而造成传说中的乱码。   或者一端用可变长度的UTF-8编码,另一端用ASCII解码(只能表示128个字符,固定一个字节),UTF-8这边如果一个字符占3个字节,如果用ASCII来解码,一个字符被当成3个字符来解码,当然结果就不对。

六、总结

  看到这里,以后碰到乱码问题解决起来就so easy了吧!只需要检查编码与解码规则在哪个环节未对应上即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA中文字符编码问题详解.doc

  • 2010年09月16日 23:15
  • 142KB
  • 下载

字符编码详解

  • 2012年03月07日 00:19
  • 58KB
  • 下载

字符编码问题详解

字符编码 出自:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681...

常用字符编码详解.doc

  • 2009年11月01日 22:29
  • 30KB
  • 下载

字符编码详解 v2.2

  • 2012年08月03日 09:26
  • 991KB
  • 下载

字符编码与字符集详解

首先总结一下我们常见到的

字符编码详解

  • 2012年12月06日 23:31
  • 44KB
  • 下载

JAVA中文字符编码问题详解

JAVA的中文字符乱码问题一直很让人头疼。特别是在WEB应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。很多次遇到乱码问题后, 经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经...

字符编码详解(ASCII ,utf-8,unicode,gbk,gb2312,iso 8859-1等)

1. ASCII 我们需要了解的最早编码是ASCII码。它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下...

技术文章 | 计算机字符编码详解与汇总

计算机中的数据是以二进制格式表示的(其中8位二进制称为一个字节,比如00100101就是一个字节。通常为了更方便的表示二进制数据,也可以转换成16进制表示出来,比如00100101就可以用0x25来表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码详解
举报原因:
原因补充:

(最多只允许输入30个字)