如何用XXXXXXX代替连续8个字符串连续出现次数都是数字的字符串连续出现次数

关于字符编码的一些介绍 - darkowner的专栏 - CSDN博客
关于字符编码的一些介绍
下面这段文字是从panny1982处转过来的,给大家分享一下:
&&& 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为&字节&。
&&& 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为&计算机&。
&&& 开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。
他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上0x10,
终端就换行,遇上0x07, 终端就向人们嘟嘟叫,例好遇上0x1b,
打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0x20以下的字节状态称为&控制码&。
他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家
看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的&Ascii&编码(American Standard Code for
Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。
后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他
们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一
个状态255。从128到255这一页的字符集被称&扩展字符集&。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国
家的人们也希望可以用到计算机吧!
等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那
些127号之后的奇异符号们直接取消掉,
规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到
0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的
字母、日文的假名们都编进去了,连在 ASCII
里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的&全角&字符,而原来在127号以下的那些就叫&半角&字符了。
&&& 中国人民看到这样很不错,于是就把这种汉字方案叫做 &GB2312&。GB2312 是对 ASCII 的中文扩展。
但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312
没有用到的码位找出来老实不客气地用上。
后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字
符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312
的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。&
&&& 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。
&&& 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 &DBCS&(Double Byte Charecter
双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处
理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣
们都要每天念下面这个咒语数百遍:&一个汉字算两个英文字符!一个汉字算两个英文字符......&
因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用
着同一种语言的兄弟地区,也分别采用了不同的 DBCS
编码方案。当时的中国人想让电脑显示汉字,就必须装上一个&汉字系统&,专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就
必须加装另一套支持 BIG5
编码的什么&倚天汉字系统&才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎
么办? 真是计算机的巴比伦塔命题啊!
&&& 正在这时,大天使加百列及时出现了:一个叫 ISO
(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号
的编码!他们打算叫它&Universal Multiple-Octet Coded Character Set&,简称 UCS, 俗称
&UNICODE&。
&&& UNICODE 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO
就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ascii里的那些&半角&字符,UNICODE
保持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于&半角&英文符号只需要用到低8位,所以其高
8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从
开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的&一个字符&!同时,也都是统一的&两个字节&,请注意&字符&和&字节&两个术语的不
同,&字节&是一个8位的物理存贮单元,而&字符&则是一个文化相关的符号。在UNICODE
中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。
从前多种字符集存在时,那些做多语言软件的公司遇上过很大麻烦,他们为了在不同的国家销售同一套软件,就不得不在区域化软件时也加持那个双字节字符集咒
语,不仅要处处小心不要搞错,还要把软件中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决方案,于是从
Windows NT 开始,MS 趁机把它们的操作系统改了一遍,把所有的核心代码都改成了用 UNICODE
方式工作的版本,从这时开始,WINDOWS 系统终于无需要加装各种本土语言系统,就可以显示全世界上所有文化的字符了。
&&& 但是,UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容,这使得 GBK 与UNICODE 在汉字的内码编排上完全是不一样的,没有一种简单的算术方法可以把文本内容从UNICODE编码和另一种编码进行转换,这种转换必须通过查表来进行。
&&& 如前所述,UNICODE
是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备
了UCS-4方案,说简单了就是四个字节来表示一个字符,这样我们就可以组合出21亿个不同的字符出来(最高位有其他用途),这大概可以用到银河联邦成立
那一天吧!
&&& UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE
如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer
Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到
UTF时并不是直接的对应,而是要过一些算法和规则来转换。
受到过网络编程加持的计算机僧侣们都知道,在网络里传递信息时有一个很重要的问题,就是对于数据高低位的解读方式,一些计算机是采用低位先发送的方法,例
如我们PC机采用的 INTEL
架构,而另一些是采用高位先发送的方式,在网络中交换数据时,为了核对双方对于高低位的认识是否是一致的,采用了一种很简便的方法,就是在文本流的开始时
向对方发送一个标志符。如果之后的文本是高位在位,那就发送&FEFF&,反之,则发送&FFFE&。不信你可以用二进制方式打开一个UTF-X格式的文
件,看看开头两个字节是不是这两个字节?
&&& 讲到这里,我们再顺便说说一个很著名的奇怪现象:当你在 windows
的记事本里新建一个文件,输入&联通&两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵,有人说这就是联通之
所以拼不过移动的原因。其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。
&&& 从网上引来一段从UNICODE到UTF8的转换规则:
Unicode&&&
&-&007F&&&
0xxxxxxx&&&
&-&07FF&&&
110xxxxx&10xxxxxx&&&
&-&FFFF&&&
1110xxxx&10xxxxxx&10xxxxxx&&&
0000 - 007F
0080 - 07FF
110xxxxx 10xxxxxx
0800 - FFFF
1110xxxx 10xxxxxx 10xxxxxx
&&& 例如&汉&字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx
10xxxxxx 10xxxxxx。将6C49写成二进制是:00
1001,将这个比特流按三字节模板的分段方法分为 001001,依次代替模板中的x,得到:
10--001001,即E6 B1 89,这就是其UTF8的编码。
&&& 而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,&联通&的内码是:
注意到了吗?第一二个字节、第三四个字节的起始部分的都是&110&和&10&,正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事
本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了&00001
101010&,再把各位对齐,补上前导的0,就得到了&10
1010&,不好意思,这是UNICODE的006A,也就是小写的字母&j&,而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就
是只有&联通&两个字的文件没有办法在记事本里正常显示的原因。&
&&& 而如果你在&联通&之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了
下面是对编码的一个总结:也是参考了部分网上内容,各位不要tor我:学习而已
1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个
符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必
需要支持GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
2、台湾,香港等地使用的是BIG5编码
3、日本:SJIS编码
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢?其
实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从
中国传播过去的,字型是完全一样的。比如:&文&字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容
纳世界上所有的语言的大部分文字了。
  Unicode的学名是&Universal Multiple-Octet Coded Character Set&,简称为UCS。
  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
-25FFF&-&  
-29FFF&-&2A000-2AFFF&-&2F000-2FFFF&&
20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
&简体中文GBK&&
  codepage=950
&繁体中文BIG5&&
  codepage=437
&美国/加拿大英语&&
  codepage=932
  codepage=949
  codepage=866
  codepage=65001
&unicode&UFT-
codepage=936 简体中文GBK
  codepage=950 繁体中文BIG5
  codepage=437 美国/加拿大英语
  codepage=932 日文
  codepage=949 韩文
  codepage=866 俄文
  codepage=65001 unicode UFT-8
  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
  从936中随意取一行,例如:
  0xABD #CJK UNIFIED IDEOGRAPH
  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或
/,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么
UTF-8是如何编码的?又是如何解决UCS-2的问题呢?
  E4&BD&A0        
  这是&你&字的UTF-8
          
  这是&你&的Unicode编码&&
  E4 BD A0        00
  这是&你&字的UTF-8编码
  4F 60          00000
  这是&你&的Unicode编码
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101
xx100000,把除了x之外的数字拼接在一起,就变成&你&的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字
节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
  以下是Unicode和UTF-8之间的转换关系表:
&-&U-0000007F:&0xxxxxxx&&
&-&U-000007FF:&110xxxxx&10xxxxxx&&
&-&U-0000FFFF:&1110xxxx&10xxxxxx&10xxxxxx&&
&-&U-001FFFFF:&11110xxx&10xxxxxx&10xxxxxx&10xxxxxx&&
&-&U-03FFFFFF:&111110xx&10xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx&&
&-&U-7FFFFFFF:&xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx&&
 U- - U-0000007F: 0xxxxxxx
  U- - U-000007FF: 110xxxxx 10xxxxxx
  U- - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
  U- - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  U- - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  U- - U-7FFFFFFF: xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了
我的热门文章中国领先的IT技术网站
51CTO旗下网站
十分钟搞清字符集和字符编码
在介绍字符集之前,我们先了解下为什么要有字符集。我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流。那 么在这两者之间的转换规则就需要一个统一的标准,否则把我们的U盘插到老板的电脑上,文档就乱码了;小伙伴QQ上传过来的文件,在我们本地打开又乱码了。
作者:来源:| 11:00
什么是字符集
在介绍字符集之前,我们先了解下为什么要有字符集。我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流。那 么在这两者之间的转换规则就需要一个统一的标准,否则把我们的U盘插到老板的电脑上,文档就乱码了;小伙伴QQ上传过来的文件,在我们本地打开又乱码了。 于是为了实现转换标准,各种字符集标准就出现了。简单的说字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解 码)的转换关系。
那么为什么会有那么多字符集标准呢?这个问题实际非常容易回答。问问自己为什么我们的插头拿到英国就不能用了呢?为什么显示器同时有 DVI,VGA,HDMI,DP这么多接口呢?很多规范和标准在最初制定时并不会意识到这将会是以后全球普适的准则,或者处于组织本身利益就想从本质上区 别于现有标准。于是,就产生了那么多具有相同效果但又不相互兼容的标准了。
说了那么多我们来看一个实际例子,下面就是耪飧鲎衷诟髦直嗦胂碌氖坪投票嗦虢峁趺囱忻挥幸恢趾诺母芯酰
16进制编码
对应的二进制数据
什么是字符编码
字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语,日语。对于一个字符集来说要正确编码转码一个字 符需要三个关键元素:字库表(character repertoire)、编码字符集(coded character
set)、字符编码(character encoding
form)。其中字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。编码字符集,即用一个编码值 code point来表示一个字符在字库中的位置。字符编码,将编码字符集和实际存储数值之间的转换关系。一般来说都会直接将code
point的值作为编码后的值直接存储。例如在ASCII中A在表中排第65位,而编码后A的数值是也即十进制的65的二进制转换结果。
看到这里,可能很多读者都会有和我当初一样的疑问:字库表和编码字符集看来是必不可少的,那既然字库表中的每一个字符都有一个自己的序号,直接把序号作为存储内容就好了。为什么还要多此一举通过字符编码把序号转换成另外一种存储格式呢?
其实原因也比较容易理解:统一字库表的目的是为了能够涵盖世界上所有的字符,但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常 低。例如中文地区的程序几乎不会需要日语字符,而一些英语国家甚至简单的ASCII字库表就能满足基本需求。而如果把每个字符都用字库表中的序号来存储的 话,每个字符就需要3个字节(这里以Unicode字库为例),这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积 是原来的三倍)。算的直接一些,同样一块硬盘,用ASCII可以存1500篇文章,而用3字节Unicode序号存储只能存500篇。于是就出现了 UTF-8这样的变长编码。在UTF-8编码中原本只需要一个字节的ASCII字符,仍然只占一个字节。而像中文及日语这样的复杂字符就需要2个到3个字 节来存储。
UTF-8和Unicode的关系
看完上面两个概念解释,那么解释UTF-8和Unicode的关系就比较简单了。Unicode就是上文中提到的编码字符集,而UTF-8就是字符 编码,即Unicode规则字库的一种实现形式。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了 各个国家语言可能出现的符号和文字,并将为他们编号。详见:。
Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符。而UTF-8则只实现了第一 个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符 的处理困难(下文会有提到)。
UTF-8编码简介
为了更好的理解后面的实际应用,我们这里简单的介绍下UTF-8的编码实现方法。即UTF-8的物理存储和Unicode序号的转换关系。
UTF-8编码为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。
如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(7个bit)代表在Unicode中的序号。且第二个字节以10开头
如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间。110之后的所有部分(7个bit)代表在Unicode中的序号。且第二、第三个字节以10开头
如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)代表在Unicode中的序号。
具体每个字节的特征可见下表,其中x代表序号部分,把各个字节中的所有x部分拼接在一起就组成了在Unicode字库中的序号
我们分别看三个从一个字节到三个字节的UTF-8编码例子:
在Unicode字库序号的十六进制
在Unicode字库序号的二进制
UTF-8编码后的二进制
UTF-8编码后的十六进制
细心的读者不难从以上的简单介绍中得出以下规律:
3个字节的UTF-8十六进制编码一定是以E开头的
2个字节的UTF-8十六进制编码一定是以C或D开头的
1个字节的UTF-8十六进制编码一定是以比8小的数字开头的
为什么会出现乱码
先科普下乱码的英文native说法是mojibake。
简单的说乱码的出现是因为:编码和解码时用了不同或者不兼容的字符集。对应到真实生活中,就好比是一个英国人为了表示祝福在纸上写了bless(编 码过程)。而一个法国人拿到了这张纸,由于在法语中bless表示受伤的意思,所以认为他想表达的是受伤(解码过程)。这个就是一个现实生活中的乱码情 况。在计算机科学中一样,一个用UTF-8编码后的字符,用GBK去解码。由于两个字符集的字库表不一样,同一个汉字在两个字符表的位置也不同,最终就会 出现乱码。
我们来看一个例子:假设我们用UTF-8编码存储很帕礁鲎郑嵊腥缦伦唬
UTF-8编码后的十六进制
于是我们得到了E5BE88E5B18C这么一串数值。而显示时我们用GBK解码进行展示,通过查表我们获得以下信息:
两个字节的十六进制数值
GBK解码后对应的字符
解码后我们就得到了寰灞这么一个错误的结果,更要命的是连字符个数都变了。
如何识别乱码的本来想要表达的文字
要从乱码字符中反解出原来的正确文字需要对各个字符集编码规则有较为深刻的掌握。但是原理很简单,这里用最常见的UTF-8被错误用GBK展示时的乱码为例,来说明具体反解和识别过程。
第1步 编码
假设我们在页面上看到寰灞这样的乱码,而又得知我们的浏览器当前使用GBK编码。那么第一步我们就能先通过GBK把乱码编码成二进制表达式。当然查表编码效率很低,我们也可以用以下SQL语句直接通过MySQL客户端做编码工作:
mysql&[localhost]&{msandbox}&&&select&hex(convert('寰灞'&using&gbk));&+&|&hex(convert('寰灞'&using&gbk))&|&+&|&E5BE88E5B18C&|&+&1&row&in&set&(0.01&sec)&
第2步 识别
现在我们得到了解码后的二进制字符串E5BE88E5B18C。然后我们将它按字节拆开。
Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6
E5 BE 88 E5 B1 8C
然后套用之前UTF-8编码介绍章节中总结出的规律,就不难发现这6个字节的数据符合UTF-8编码规则。如果整个数据流都符合这个规则的话,我们就能大胆假设乱码之前的编码字符集是UTF-8
第3步 解码
然后我们就能拿着E5BE88E5B18C用UTF-8解码,查看乱码前的文字了。当然我们可以不查表直接通过SQL获得结果:
mysql&[localhost]&{msandbox}&((none))&&&select&convert(0xE5BE88E5B18C&using&utf8);&+&|&convert(0xE5BE88E5B18C&using&utf8)&|&+&|&很&|&+&1&row&in&set&(0.00&sec)&
常见问题处理之Emoji
所谓Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符。这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF。Emoji表情随着IOS的普及和微信的支持越来越常见。下面就是几个常见的Emoji:
那么Emoji字符表情会对我们平时的开发运维带来什么影响呢?最常见的问题就在于将他存入MySQL数据库的时候。一般来说MySQL数据库的默认字符集都会配置成UTF-8(三字节),而utf8mb4在5.5以后才被支持,也很少会有DBA主动将系统默认字符集改成utf8mb4。那么问题就来了,当我们把一个需要4字节UTF-8编码才能表示的字符存入数据库的时候就会报错:ERROR 1366: Incorrect string value: '\xF0\x9D\x8C\x86' for column 。
如果认真阅读了上面的解释,那么这个报错也就不难看懂了。我们试图将一串Bytes插入到一列中,而这串Bytes的第一个字节是\xF0意味着这是一个四字节的UTF-8编码。但是当MySQL表和列字符集配置为UTF-8的时候是无法存储这样的字符的,所以报了错。
那么遇到这种情况我们如何解决呢?有两种方式:升级MySQL到5.6或更高版本,并且将表字符集切换至utf8mb4。第二种方法就是在把内容存入到数据库之前做一次过滤,将Emoji字符替换成一段特殊的文字编码,然后再存入数据库中。之后从数据库获取或者前端展示时再将这段特殊文字编码转换成Emoji显示。第二种方法我们假设用-*-1F601-*-来替代4字节的Emoji,那么具体实现python代码可以参见Stackoverflow上的回答。【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点热点热点
24H热文一周话题本月最赞
讲师:95660人学习过
讲师:152671人学习过
讲师:227666人学习过
精选博文论坛热帖下载排行
本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程管理、压缩与查询系统、Shel...
订阅51CTO邮刊}

我要回帖

更多关于 python 连续相同字符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信