`
wanxiaotao12
  • 浏览: 457254 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入了解字符集和编码问题

 
阅读更多

对于字符集,编码的问题, 一直都搞不太明白, 下面好好学习一下

一、什么是字符集?什么是编码? 

字符(Character)是文字与符号的总称,包括文字(中文汉字, 英文字母)、图形符号、数学符号等。 
一组抽象(可能按某一维度来区分不同的字符,比如按照语言,将字符分类,分为中文字符集、英文字符集)字符的集合就是字符集(Charset)。它是字符的集合,也可以理解为字符的分类,比如英文字符集、中文字符集等。

 
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 
一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 
字符集的子集也是字符集。 

计算机要处理各种字符,就需要将字符和二进制内码对应起来(因为计算机只能识别二进制)这种对应关系就是字符编码(Encoding)。 
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。 
每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

 

二、有哪些字符集? 

ASCII: 
American Standard Code for Information Interchange,美国信息交换标准码。 
目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 
它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。 
ASCII字符集由控制字符和图形字符组成。 
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。 
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。 
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。 
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 

ISO 8859-1: 
ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准,现时定义了15个字符集。 
ASCII收录了空格及94个“可印刷字符”,足以给英语使用。 
但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可以使用ASCII及控制字符以外的区域来储存及表示。 
除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。 
    *很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。 


但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。
而且在很多协议上,默认使用该编码。 

Unicode: 
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。 

它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去 

Unicode只定义了什么字符对应的二进制是什么, 但是具体这个字符在计算机中占用多少个字节数, 并没有规定。

 

utf-8、utf-16是具体规定了占用多少个字节数


    * UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节, 还有占用4个字节。 
    * UTF-16: 16bit编码,是占用定长字节数, 两个字节。

汉字编码: 
    * GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个 
    * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 
    * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 
    * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。 


三、编程语言与编码 

C、C++、Python2内部字符串都是使用当前系统默认编码 
Python3、Java内部字符串用Unicode保存 
Ruby有一个内部变量$KCODE用来表示可识别的多字节字符串的编码,变量值为EUC SJIS UTF8 NONE之一。 


四、为什么会乱码? 

乱码是个老问题,从上面我们知道,字符在保存时的编码格式如果和要显示的编码格式不一样的话,就会出现乱码问题。 
我们的Web系统,从底层数据库编码、Web应用程序编码到HTML页面编码,如果有一项不一致的话,就会出现乱码。 
所以,解决乱码问题说难也难说简单也简单,关键是让交互系统之间编码一致。 

五、有没有万金油? 

在如此多种编码和字符集弄的我们眼花缭乱的情况下,我们只需选择一种兼容性最好的编码方式和字符集,让它成为我们程序子系统之间 
交互的编码契约,那么从此恼人的乱码问题即将远离我们而去 -- 这种兼容性最好的编码就是UTF-8! 
毕竟GBK/GB2312是国内的标准,当我们大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。 

分享到:
评论

相关推荐

    深入理解字符编码(字符集 字符编码 字符显示 乱码问题)

    文档中主要介绍了各类字符集以及相关的字符编码,字符的显示原理,从输入到显现的整个过程,程序中出现的乱码问题以及解决方案

    字符集和编码高度概括 (英文)

    深入地概括了常用的字符集和编码, 看后可对相关知识有深入的理解.

    C语言基础之转义字符:从原理到应用的字符编码教程 .txt

    本资源利用多个实例,如打印文件路径、输出控制字符、显示特殊字符等,展示了C语言转义字符的用法和作用,以及相关的概念和知识,如ASCII码、字符集、字符串等。本资源适合C语言教学和学习的教师和学生使用,帮助...

    jsp中文问题解决方案.pdf

    根据网上的相关资料整理 初学者往往会遇到JSP处理中文时引起的乱码问题 即时一些初级教程也仅仅是...对JSP处理字符集的理解难以深入! 本pdf文档根据网上收集的资料己本人的个人总结汇编而成,希望对你能有所帮助!

    深入理解C++11:C++11新特性解析与应用

    2748.3.1 字符集、编码和Unicode 2748.3.2 C++11中的Unicode支持 2768.3.3 关于Unicode的库支持 2808.4 原生字符串字面量 2848.5 本章小结 286附录A C++11对其他标准的不兼容项目 287附录B 弃用的特性 294附录C ...

    亮剑.NET深入体验与实战精要3

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    .NET之美:.NET关键技术深入分析

    10.3 中英文字符大小和文本边界问题 10.4.1 ASCIl、UTF8、Unicode编码下的中英文字符大小 10.4.2文本边界问题 10.5异步传输字符串 10.5.1 服务端的实现 10.5.2客户端的实现 10.5.3程序测试 10.6文件传输 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    单片机教程与设计(实验报告)

    这些实验涉及到嵌入式系统开发和数字电路设计的基本原理和技术,旨在帮助读者深入理解这些领域的知识和技巧,为他们打下坚实的基础。 实验一:多字节加法 在本实验中,我们将研究多字节加法的实现原理。通过学习多...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    全球电子游戏的销售和评分数据集.rar

    视频游戏销售和评级数据集提供了对视频游戏动态世界的深入分析,提供了对不同平台和发行商的销售和评级的全面分析。该数据集包含有价值的信息方面,揭示了多年来有关视频游戏行业的各种见解。 该数据集包括关键方面...

    PHP和MySQL Web开发第4版pdf以及源码

    4.6.2 字符集和类 4.6.3 重复 4.6.4 子表达式 4.6.5 子表达式计数 4.6.6 定位到字符串的开始或末尾 4.6.7 分支 4.6.8 匹配特殊字符 4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子...

    PHP和MySQL WEB开发(第4版)

    4.6.2 字符集和类 4.6.3 重复 4.6.4 子表达式 4.6.5 子表达式计数 4.6.6 定位到字符串的开始或末尾 4.6.7 分支 4.6.8 匹配特殊字符 4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 ...

    PHP和MySQL Web开发第4版

    4.6.2 字符集和类 4.6.3 重复 4.6.4 子表达式 4.6.5 子表达式计数 4.6.6 定位到字符串的开始或末尾 4.6.7 分支 4.6.8 匹配特殊字符 4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子...

    亮剑.NET深入体验与实战精要2

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    5.6.3 属性和字段的设计编码规范 157 5.6.4 提供属性验证 157 5.6.5 只读和只写属性 159 5.6.6 为取值方法和赋值方法指定访问修饰符 160 5.6.7 属性作为虚字段使用 161 5.6.8 属性和方法调用...

    LINGO软件的学习

    LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行...

    精通并发与netty视频教程(2018)视频教程

    45_深入探索Java字符集编解码 46_字符集编解码全方位解析 47_Netty服务器与客户端编码模式回顾及源码分析准备 48_Netty与NIO系统总结及NIO与Netty之间的关联关系分析 49_零拷贝深入剖析及用户空间与内核空间切换方式...

Global site tag (gtag.js) - Google Analytics