字符集及其存储方式(解决乱码问题)

阅读大概需要4分钟

在我们进行文本挖掘或处理文档时,都要面临一个最最基本的问题->就是解决乱码问题。在此,介绍最本质的字符编码。

我们熟悉的有三种:ASCII字符集,中文字符集(GBK),Unicode字符集

ASCII字符集

故事:

美国信息交换标准代码,这是计算机上最早使用的通用的编码方案。那个时候计算机还只是拉丁文字的专利,根本没有想到现在计算机的发展势头,如果想到了,可能一开始就会使用unicode了。当时绝大部分专家都认为,要用计算机,必须熟练掌握英文。这种编码占用7个Bit,在计算机中占用一个字节,8位,最高位没用,通讯的时候有时用作奇偶校验位。因此ASCII编码的取值范围实际上是:0x00-0x7f,只能表示128个字符。后来发现128个不太够用,做了扩展,叫做ASCII扩展编码,用足八位,取值范围变成:0x00-0xff,能表示256个字符。其实这种扩展意义不大,因为256个字符表示一些非拉丁文字远远不够,但是表示拉丁文字,又用不完。所以扩展的意义还是为了下面的ANSI编码服务。

- 单字节存储

用一个字节(8位)来表示字符

共2^7=128个字符

字符集:规则的集合

字符 -> 字符对应的二进制数字

存储方式:

字符对应的二进制数字 -> 实际存储数值

中文字符集

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。这一版的GBK规范为1.0版。

产生原因:ASCII 字符集无法表示中文

GBK等汉字编码:

多字节存储,兼容ASCII, 存储方式:EUC4-CN

高位为1的字节,表示其是一个双字节二进制码

Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

支持世界上几乎所有字符的字符集

表示范围:0000 ~ 10FFFF、 100多万个符号

存储方式:UTF-8, UTF-16, UTF-32

UTF-8:

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

变长存储: 使用1~4个字节。

对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

很明显,在C++中为了解决是汉字还是字母的问题上,判断其二进制首位即可。而java则不用,有直接扫描字符的函数。(还有同学问了,那为啥要用C++...a simple reason 嘛,C++快

再举个实例:

OK,回归主题:乱码?

例如:UTF-8存储方式的文件,用GBK方式读取 or GBK存储方式的文件,用UTF-8方式读取 就会产生乱码

ANSI - Windows中默认的字符集

这个还得了解!

在你在windows 下保存一个文本时,默认的第一个保存方式就是这个东东。

在中文Windows操作系统中:

对于英文文件是ASCII字符集。

对于简体中文文件是GB2312字符集。

繁体中文版会采用Big5字符集。

在日文Windows操作系统中:

对于英文字符是ASCII字符集。

对于日文字符是Shift_JIS。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

参考潘达师兄ppt

每日托福单词

consensus n. 一致意见,共识

stereotype n. 思维定势 v. 刻板地对待

larva n.幼虫

vague adj. 含糊的,不明确的

saint n. 圣徒,圣人

原文发布于微信公众号 - 深度学习自然语言处理(zenRRan)

原文发表时间:2018-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cs

python笔记一 入门py

id()函数,是python内置函数,查看每一个对象的地址。 >>> help(id); Help on built-in function id in mod...

3736
来自专栏写代码的海盗

分水岭 golang入坑系列

第三式开篇语有些负面, 所以这里就不贴了。有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/conten...

3904
来自专栏程序人生 阅读快乐

C Primer Plus(第6版)(中文版)

《C Primer Plus(第6版)中文版》详细讲解了C语言的基本概念和编程技巧。

1161
来自专栏北京马哥教育

让你的 Python 代码优雅又地道

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 译序 如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣...

39910
来自专栏程序员八阿哥

年薪20万Python工程师进阶(6):Python ORM框架之 Peewee入门Python中10个必读的PEP提案

PEP 是 Python 增强提案(Python Enhancement Proposal)的缩写。社区通过PEP来给 Python 语言建言献策,每个版本你所...

1183
来自专栏FreeBuf

学点编码知识又不会死:Unicode的流言终结者和编码大揭秘

如果你是一个生活在2003年的程序员,却不了解字符、字符集、编码和Unicode这些基础知识。那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩...

19410
来自专栏一名合格java开发的自我修养

字符编码笔记:ASCII,Unicode和UTF-8

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。 再后来,...

1751
来自专栏我有一个梦想

UE4中的单映射:TMap容器

一、TMap<T>是么 TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每...

2219
来自专栏康怀帅的专栏

Shell date 命令详解

以给定的格式显示当前时间。 %% 一个文字的 % %a 当前locale 的星期名缩写(例如: 日,代表星期日) %A 当前locale 的星...

3674
来自专栏wym

HDU 6386 Age of Moyu 2018 Multi-University Training Contest 7(最短路径dijkstra)

题意:第一行给出n,m,接下来有m条路,每一行给出 a b c ,从a到b 是c掌控。

1272

扫码关注云+社区

领取腾讯云代金券