无论是在工作中还是在生活中,相信很多同学都被“坤qao”深深毒害过,比如这个、这个、这个,为什么?这些奇怪的人物会出现吗?接下来,让我们一探究竟!ASCII码以0和1存储在计算机的底部。ASCII码将所有字母和符号编码,并转换成二进制的0和1进行存储。字母和符号占用1个字节(即8位)。标准的ASCII码规定最高位必须为0,所以只能有128个ASCII码,转换成十进制是0-127。标准的ASCII码表如下:ASCII码表只有128个字符,对于英文来说已经足够了,但是世界上还有很多国家的字符不同,这时候就需要一个更全面的编码。Unicode(也称为Unicode、UniversalCode、Unicode)是计算机科学领域的一个行业标准。它为每种语言中的每个字符设置了统一且唯一的二进制编码。在表示一个Unicode字符时,通常使用“U+”后跟一组十六进制数字来表示这个字符。UTF-8和GBKUTF-8是Unicode的可变长度字符编码。它可以用来表示Unicode标准中的任何字符,其编码中的第一个字节仍然兼容ASCII。UTF-8使用一到四个字节对每个字符进行编码。常用汉字使用3个字节编码。因为UTF-8是Unicode的变长字符编码,它包含了世界上所有字符的编码。对于早输入的字符,优先使用1或2个字节存储。输入存储的字符会占用较大的字节,所以那些输入晚的字符会占用较大的存储空间。对于一个中文网站来说,其他国家的字符其实是没有必要出现的,但是中文字符是用UTF-8编码的,但是大部分都占用了3个字节甚至更多,造成了不必要的存储浪费。为了解决这个问题,中华人民共和国国家信息技术标准化技术委员会制定了一套GB系列编码,其中最常用的是GBK。GBK编码采用英文单字节编码,完全兼容ASCII字符。汉字使用两个字节进行编码。编码范围从0x8140(十六进制)到0xFEFE(不包括xx7F),一共23940个码位,总共包含23940个码位。汉字21003个,图形符号883个。为什么要去掉xx7F,因为它对应的ASCII码表是DEL,意思是向后删除一个字符。为什么“kunjincopy”的Unicode编码中不断包含各种字符,这可能会导致各个操作系统支持的Unicode字符存在差异。这样也会导致A上的Unicode编码的字符,在B上无法显示。为了避免这种情况,一个特殊的字符?以Unicode定义,其Unicode编码为0xFFFD。如果A支持特殊字符?,而B不支持这个?,则将其替换为?B中的这个字符经过UTF-8编码后,其十六进制表示为0xEF0XBF0XBD。如果两个?符号连续出现,那么UTF-8编码的16进制表示为0xEF0XBF0XBD0xEF0XBF0XBD,此时再转码成GBK,因为GBK是用两个字节来表示一个字符,那么上面的字符就变成坤(0xEFBF)、进(0xBDEF)和复制(0xBFBD)。kunjin复制的原因是UTF-8转码GBK的过程中出现了问题。当然,如果要复制,至少需要两个字符才能出现乱码。接下来直接用代码看效果:@TestvoidcontextLoads()throwsException{Stringstr="?";StringstrCode=newString(str.getBytes("UTF-8"),"GBK");System.out.println(strCode);}运行结果是?,前面说过,如果要有?,至少需要两个字符。现在修改代码。@TestvoidcontextLoads()throwsException{Stringstr="??";StringstrCode=newString(str.getBytes("UTF-8"),"GBK");System.out.println(strCode);}运行结果如下。以后遇到副本不要慌,一定是UTF-8转GBK编码有问题。现在看来,GBK编码虽然减少了内存的浪费,但是也带来了很多问题。本文转载自微信公众号“Java之旅”,可通过以下二维码关注。转载本文请联系Java之旅公众号。
