关闭

字符编码详解

501人阅读 评论(0) 收藏 举报
分类:

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了吧!只需要检查编码与解码规则在哪个环节未对应上即可。

1
0
查看评论

Python字符编码整理

python 字符编码
  • CopyStylexh
  • CopyStylexh
  • 2017-06-07 13:16
  • 148

Qt字符编码要点

1、  首先明确几种常用的编码,UTF-8、GBK、UNICODE。UNICODE。 明确概念0: "我是汉字" 是C语言中的字符串,它是char型的窄字符串。上面的例子可写为const char * str = "我是汉字";QString a...
  • wenwenxiong
  • wenwenxiong
  • 2015-01-07 17:45
  • 551

Python字符串编码详解

前言“字符串”是Python非常常用的一种数据类型,当所有的内容全是英文的时候,世界静好;但是字符串中涉及到中文字符的时候,问题来了…提到Python的字符串编码,我是这样的 不知道多少个夜晚,被Python的编码问题搞的心力交瘁生无可恋。好,现在我就要代表宇宙消灭你!!!盘古开天辟地计算机在最初...
  • destinyuan
  • destinyuan
  • 2016-05-12 16:15
  • 889

字符编码历史(字符编码详解)

1 字符集概述     简单来说字符集就是一套文字符号及其编码的描述。从20世纪60年代美国标准化组织ANSI发布了第一个计算机字符集ASCII开始,为了处理不同的文字,各大计算机公司,各国政府,以及各种标准化组织发明了几百种字符集,例如我们所熟悉的:ASCII,USC,GBK,...
  • gcl272633743
  • gcl272633743
  • 2016-05-23 20:43
  • 263

计算机字符编码详解——从理论到实践

前言 最近在看《深入理解计算机系统》,读到“字符编码”时不禁想起了初学时那段痛苦的岁月,同时又没找到一篇将理论和实践结合在一起的文章,为此决定自己写一份。希望能把我走过的弯路总结出来,能帮助一些还在路上的朋友。 关于计算机如何存储信息,请参考《深入理解计算机系统》的第 02 章内容,此文只讲解与...
  • xuejianhui
  • xuejianhui
  • 2016-09-24 17:52
  • 4126

深入分析字符编码之一-几种常见的字符编码格式

编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多。本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别;Java 中经常需要编码的场景;出现中文问题的原因分析;在开发 Jav...
  • javaiswhat
  • javaiswhat
  • 2016-05-08 15:47
  • 1626

Java字符编码详解

char “字节”是byte,“位”是bit ; 1 byte = 8 bit ; char 在Java中是2个字节。java采用unicode(《java核心技术卷一》里面有详细说明),2个字节(16位)来表示一个字符。而Unicode编码包括汉字,所以也可以给char赋值汉字。...
  • qq_25665807
  • qq_25665807
  • 2017-08-18 15:15
  • 220

字符编码详解

字符编码详解 http://www.crifan.com/files/doc/docbook/char_encoding/release/html/char_encoding.html#zhcn_charset_encoding
  • laogaoAV
  • laogaoAV
  • 2014-03-16 18:03
  • 408

字符集和字符编码详解

字符集和字符编码详解   相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"、"�????????"?还记得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Enc...
  • u010456903
  • u010456903
  • 2015-09-28 20:05
  • 441

字字符编码详解

每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,“乱码问题”一直是让人头疼的问题,也许您已经很少遇到“乱码”问题,然而,对解决乱码的方法的内在原理,您是否明白?本人作为一个程序员,在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂、不清不楚;在工作
  • zxx2403
  • zxx2403
  • 2011-08-27 12:11
  • 516
    个人资料
    • 访问:70983次
    • 积分:1663
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:1篇
    • 译文:0篇
    • 评论:29条
    独立博客
    博客专栏
    文章分类
    最新评论