如何用gbk编码(名字里的gbk编码)

本文开始前先列举几个奇怪的字符比较(为了方便看效果请复制,否则会让人大失所望)

★“特殊字符”不相等

— JS代码\n'‐'=='-'; //false\n– SQL语句\nselect "'‐'='-'" as '比较', '‐'='-' as '比较结果'; — 0

★“常见字符”不相等

— JS代码\n'abc‬'=='abc'; //false\n– SQL语句\nselect "abc‬=abc" as '比较', 'abc‬'='abc' as '比较结果'; — 0

★“空字符”不相等

— JS代码\n'‬'==''; //false\n– SQL语句\nselect "'‬'=''" as '比较', '‬'='' as '比较结果'; — 0

如何用gbk编码(名字里的gbk编码)

MySQL执行结果

如何用gbk编码(名字里的gbk编码)

javascript运行结果

★记事本中诡异的现象  一个世界级拳王,一个相声演员,难道泰森跟牛群有瓜葛吗?以下是win10以下版本(不包含win10)操作。保存快捷键ctrl+s,或者点击关闭,然后选择保存,再次打开【注:文本文件一定要用操作系统默认的打开方式】

win10及以上,其实是修复了这个bug,不过按照以下方式还是可以重现这个bug的。

  太神奇了“泰森血战牛群”是乱码,多加了一个“了”就正常显示。其实类似的还有“联通”、“搂”等。【注:“搂”保存之后会变成“§”,下面会用到该示例】

  记事本中涉及到常用的编码ASCII、GBK编码(包括GB2312)、utf-8编码、ANSI编码、unicode等多种编码,那我们先从记事本讲起吧!

  记事本为什么会出现诡异的问题,一切要从计算机的发展历史说起。 大概70,80年代很早之前的操作系统(DOS系统前身)是没有图形化界面的,只有输入一串串英文数字符号。然而作为世界人口大国跟文明古国的中国人就郁闷了,这玩意不支持中文还咋用,于是撸起袖子干。

如何用gbk编码(名字里的gbk编码)

以下是微软dos系统自带记事本【注:非图形界面的记事本】的伪代码:

如何用gbk编码(名字里的gbk编码)

其中1: ASCII码参考 http://www.51hei.com/mcu/4342.html

如何用gbk编码(名字里的gbk编码)

如何用gbk编码(名字里的gbk编码)

  后面随着1994年前后微软桌面操作系统Windows NT横空出世并进入中国市场,汉字编码也迎来了一个新的重大版本GBK【由两个字节组成,字节最高位为1,向上兼容GB2312】。它使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-1980标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。它的编码规则如下:

如何用gbk编码(名字里的gbk编码)

  微软为了适应不同的市场,不同地区的文字,发明了一个ANSI编码,这个编码在不同国家地区会显示不同编码。对于英文文件是ASCII【由一个字节组成,字节最高位为0】编码,对于简体中文文件是GBK编码(只针对 Windows 简体中文版,如果是繁体中文版会采用 BIG5 码)。以下是window自带记事本更新后的伪代码:

如何用gbk编码(名字里的gbk编码)

  一切都是那么清晰完美,怎么可能会出现乱码呢?确实如此,在当时没有出现过乱码。然而随着电脑越来越普及,世界上存在着越来越多的编码方式,同一个二进制数字可以被解释成不同的符号。

就拿中国来说,存在多个民族,也有不同的文字:彝文:ꆍꆎꆏꆐꆑꆒ维吾尔文:تاماق بارمۇ؟藏文:ཙཚཛཛྷཝ蒙古文:ᠢᠣᠤᠥᠦᠧ

外国的文字:

日文呢?ぜそぞただち

经常跟我们抢申遗的韩国? 뛞뛟뛠뛡뛢뛣奇葩的泰国?อฮฯะัาำิีึืฺุู 可以找茬的契文?

上面是有国界的,那没有国界的字符如下: 音乐字符如何呈现? 盲文怎么办?⠸⠹⠺⠻⠼⠽ 麻将怎么玩? 表情符又怎么表示?

如何用gbk编码(名字里的gbk编码)

  如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 万国码Unicode【UTF-8编码是 Unicode 的实现方式之一】,就像它的名字都表示的,这是一种所有符号的编码。它支持世界上所有的字符。Unicode编码比较复杂,下面只简单介绍最常用的实现方式之一的UTF-8.

  UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。它的编码规则很简单,只有两条:

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

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

下表总结了编码规则,字母x表示可用编码的位。

unicode符号范围 | UTF-8编码方式(红色是标记位)(十六进制) | (二进制)———————-+———————————————0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxunicode字符集的二进制编码规则:删除标记位上的数字,将剩余的二进制数字合在一起,不足16位的,在数字前补足0。  微软为了布局全球于是支持了Unicode,但当时大部分软件都是用ANSI编码的,unicode还不流行,怎么办?Windows想了个办法,就是允许一个默认语言编码,就是当遇到一个字符串,不是unicode的时候,就用默认语言编码解释。而记事本的ANSI编码,就是这种默认编码,所以,一个中文文本,用ANSI编码保存,在中文版里编码是GBK模式保存的时候,到繁体中文版里,用BIG5读取,就全乱套了。

  记事本也不甘心这样,所以它要支持Unicode,但是有一个问题,一段二进制编码,如何确定它是GBK还是BIG5还是UTF-16/UTF-8?记事本的做法是在TXT文件的最前面保存一个标签,如果记事本打开一个TXT,发现这个标签,就说明是unicode。标签叫BOM,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF则UTF16BE,如果是0xEF 0xBB 0xBF,则是UTF-8。如果没有这三个东西,那么扫描文本中的所有字符,如果所有字符都满足这个编码规则,则就将改编码设置成默认编码。修改后的伪代码如下:

如何用gbk编码(名字里的gbk编码)

也就是输入“泰森血战牛群”中的了,由于“了”不满足unicode编码,所有字符都符合GBK编码规范,所以正常显示。微软自以为聪明完美拥抱了unicode,万无一失,此刻的心情是这样的

  由于"泰森血战牛群"保存是乱码而且完全无法识别,下面用“搂”这个示例完整地看下window自带记事本的处理流程并验证我的猜想。

1.新建一个记事本文件:由于操作系统是中文,那么系统默认编码就是GBK,但是未指定编码(因为它不知道要存储的内容)2.输入关键字“搂”:当前系统GBK,输入设备“搂”(十六进制C2A7)转成二进制字节11000010 10100111存储在内存

如何用gbk编码(名字里的gbk编码)

3. 判断字符编码:符合utf8编码方式110xxxxx 10xxxxxx,根据utf8转换成二进制00000000 10100111,转成十六进制就是A7,也就是§

如何用gbk编码(名字里的gbk编码)

4. 保存:将A7保存在磁盘中。5. 用window自带记事本打开显示§

推荐以下在线工具对上述的进行验证:

用自带的记事本打开上面的文字的效果如下:

如何用gbk编码(名字里的gbk编码)

  如何看到汉字的unicode编码呢?下面介绍三种简单的显示办法。下面以中为例,其编码如下:

如何用gbk编码(名字里的gbk编码)

如何用gbk编码(名字里的gbk编码)

如何用gbk编码(名字里的gbk编码)

可见“中”由三个字节e4b8ad组成(移除efbbbf BOM标签),转成二进制位:11100100 10111000 10101101 按照utf-8编码规则转成二进制代码点:01001110 00101101,再转成16进制

如何用gbk编码(名字里的gbk编码)

③用js代码获取

如何用gbk编码(名字里的gbk编码)

针对'‐'=='-',其实这两个看似长的一样的字符,其实是不同字符,见如下:

如何用gbk编码(名字里的gbk编码)

如何用gbk编码(名字里的gbk编码)

'abc‬'=='abc',这个其实有一个字符串中包含了一个不可见的字符(用上面的方法也可以找到对应的unicode编码点,有兴趣的小伙伴试试在此就不再说明),如下所示:

如何用gbk编码(名字里的gbk编码)

如何用gbk编码(名字里的gbk编码)

3. UTF-8编码透析–神奇的“联通”乱码现象 https://blog.csdn.net/qfguan/article/details/121145568

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2022年9月3日 14:26
下一篇 2022年9月3日 14:29

相关推荐

发表回复

登录后才能评论