csv转为utf8编码_编码和解码
:Vegout
如有问题或建议,请留⾔;
内容⽬录
概念
字符的三种形态
字符的三种形态
图⽚来⾃:zhuanlan.zhihu/p/25435644
编码:将字符转为字节序列(abcdefg-------------> 0101010…….10010)
解码:将字节序列转为字符(1001010…….10010110------> abcdefg)
各种编码
ASCII编码
计算机,它只认识0和1,也就是⾼低电平。于是想让计算机识别我们⼈类的语⾔,也就是字符,则需要⼀个对应关系。由于计算机在美国诞⽣,于是美国给了⼀个对应关系表,称为ASCII编码
在这⾥插⼊图⽚描述
各个国家的编码
各个国家为了使⽤计算机,也需要本国的语⾔符号被计算机识别,于是各种编码层出不穷:中国有GBK,⽇本有EUC-JP,韩国有EUC-KR,甚⾄⼀个国家也不只有⼀种编码,⽐如中国繁体还有big5等等。总之就是,每个国家为了让计算机认识⾃⼰国家的⽂字,都出了许多对应的编码。
统⼀编码
每个国家都制定了⾃⼰的编码,每个⽹站都可以在⾃⼰的国家运⾏良好。但互联⽹是让全世界连成了⼀体,当本国发出的信息⾛向国际时,多语⾔环境让每⼀种编码都措⼿不及。于是出现了unicode编码。
Unicode(中⽂:万国码、国际码、统⼀码、单⼀码)是计算机科学领域⾥的⼀项业界标准。它对世界上⼤部分的⽂字系统进⾏了整理、编码,使得计算机可以⽤更为简单的⽅式来呈现和处理⽂字。
Unicode伴随着通⽤字符集的标准⽽发展,同时也以《The Unicode Standard》书本的形式对外发表。Unicode⾄今仍在不断增修,每个新版本都加⼊更多新的字符。当前最新的版本为2019年3⽉5⽇公布的12.0.0[2],已经收录超过13万个字符(第⼗万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形、编码⽅法、标准的字符编码外,还包含了字符特性,如⼤⼩写字母。
——
说⽩了,unicode编码就是收录了全世界的所有字符,统⼀进⾏编码。也就是给每⼀个形状赋予⼀个数
字,这是它的编码⽅式,但是怎么实现的呢?
Unicode的实现⽅式不同于编码⽅式。⼀个字符的Unicode编码是确定的(也就是说,字符对应的数字是确定的)。但是在实际传输过程中,由于不同系统平台的设计不⼀定⼀致,以及出于节省空间的⽬的,对Unicode编码的实现⽅式有所不同(也就是说,这个数字⽤⼏个字节来存有所不同)。Unicode的实现⽅式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。⽐如UTF-
8、UTF-16等。可以简单理解,unicode是⼀个字符集,utf8等是这个字符集的不同编码规则实现。
从mysql中读取数据的编解码历程
这个是个简单的场景:中间的服务器中跑了⼀个javaweb项⽬,他把mysql中的数据拿出来,然后交给前端展⽰。
⾸先数据库中已经有了数据,⽐如我们存了⼀句话“i am tian 峰”。mysql中的数据说到底还是⼀种特殊⽂件,并且是以⼆进制补码的形式存在磁盘上。换句话说,就是⼀串有规律的0101。当我们向数据库发起查询请求之后,mysql⾸先得将需要查的这串0101读取出来,然后进⾏编码转换(有⼀个参数叫character_set_results指明了返回数据的编码),再发送给java后台,我们收到这串0101之后,将它转发给前端浏览器,浏览器采⽤指定的编码进⾏解码,得到对应的数字,然后对照字符集合,将字符图形展⽰出来。
说⼀个下这个简单项⽬的各个编码参数:
平台:windows(默认编码GBK)
mysql:utf-8
浏览器页⾯:utf-8
当我们通过jdbc完成查询,得到ResultSet之后就可以进⾏数据的处理了。此时ResultSet中的数据不只有数据,还有此数据的编码类型。我们就可以进⾏数据的处理了。
数字转unicode编码
在这⾥插⼊图⽚描述
图中我标出了三个箭头,分别指向A、B、X三⾏。先说⼀下结果:如果我们注释掉A⾏,使⽤B和X,那么浏览器将正常显⽰中⽂字符;如果注释掉B⾏,使⽤A和X,那么浏览器将出现乱码。X⾏就是将buffer中的字节数组返回给http客户端(浏览器),A⾏是将字符串ss转换为⾃⼰数组放⼊buffer中,ss是从set中get到的。get的过程就是⼀个解码的过程,set中本来是mysql返回的经过utf-8编码得到的字节数组,ss就是通过解码得到的对应字符串。这⾥解码时使⽤的编码是resultSet指定的,也就是mysql服务端指定的,于是可以很顺畅的得到⼀个正常的字符串。但是A⾏⼜要将这个字符串进⾏编码,得到字节数据,这⾥采⽤的编码还是服务端指定的吗?可惜不是了,他会采⽤平台默认的编码,就是GBK。对与中⽂来说,GBK存储中⽂使⽤两个字节,⽽UTF-8使⽤三个。但是也没啥,不过就是采⽤新的编码,由UTF-8转到了GBK,但是不巧的是,上边说了,浏览器使⽤的是utf-8。当浏览器采⽤utf-8去解码gbk编码产⽣的字节数时,发现⾃⼰并不认识这个字节序列。于是出现了乱码,但此时,只要我们将浏览器页⾯编码改为gbk(html页⾯中可以设置字符编码),⽴刻就恢复了正常。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。