当前位置: 首页 > 科技观察

赵云叫华东?曹操叫比格?本文将带你了解字符编码

时间:2023-03-22 12:08:27 科技观察

早期玩过辉煌三国游戏的同学一定对游戏中的乱码印象深刻。比如《三国志曹操传》,里面曹操的名字变成了“卞举”,赵云的名字变成了“解冻”。其他角色的名字也是乱码。即便如此,也挡不住一款优秀的策略游戏对玩家的吸引力。很多玩家会在出现乱码的情况下,凭着猜测和不屈的意志继续玩下去。而一些懂一点技术的同学,会使用各种转码工具,将乱码转换成可读的繁体字。那么为什么会出现这样的乱码情况呢?那我们就从计算机对字符的存储格式说起吧。我们知道计算机以二进制形式存储数据。字符编码决定了同样的二进制数据在计算机上显示的是什么字符。比如最简单的ASCII码,二进制数0100??0001,十六进制为0x41,代表字母A。那么如果计算机看到这个二进制串,并且是用ASCII编码的,就会显示为A。同时,01100001,即十六进制的0x61代表字母a。那么如果有另一种编码将二进制数串01000001定义为“一”,那么以这种编码格式读取的二进制数串将显示为“一”。这就是早期老游戏出现乱码的原因。原因是那些游戏大多是台湾的Big5繁体字编码,但是在我们的电脑上显示的是中国大陆的GBK简体字,所以有问题。下面小编就通过Mysql数据库自带的转码功能,带大家看看“解冻”是如何变成赵云的。第一步:我们先找出解冻的十六进制代码selecthex(convert('thawing'usinggbk));hex函数用于显示字符串的十六进制编码,convert函数使用解冻gbk格式编码的两个字符。执行后,我们得到了gbk码下defrozen这两个词的十六进制表示。我们可以看到BBAFB6B3是解冻这个词在gbk编码下的十六进制表示。如果转换为二进制,则为10111011101011111011011010110011。第二步:将十六进制代码转换为big5代码选择convert(0xBBAFB6B3usingbig5);这里,我们把刚才解冻出来的两个单词对应的十六进制数,转换成big5码格式,看看big5码里面,这串十六进制数代表什么。所以我们看到在big5代码中,这串数字用繁体字显示为赵云。这样我们就可以看出为什么有些老游戏,用big5代码开发的游戏在大陆简体中文系统上变成乱码了。同样,我们可以找到放大后的十六进制和对应的big5码。与现在类似,由于硬件价格的大幅下降,大部分软件都使用unicode开发,因此可以在世界上大多数计算机上使用。不过还是有一些软件,在某些情况下会出现编码问题。比如最新版本的Mysql,在中文Windows操作系统的电脑上,如果电脑名使用中文,就会出现安装错误。