大家好,感谢邀请,今天来为大家分享一下110网站源码分享的问题,以及和正版网站源码的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
原码,补码,反码
因为原码,补码,反码比较简单,我这里粘贴一个例子进行展示。
Unicode和UTF-8的关系
Uincode是一个字符集。它规定了我们使用到的字或符号的码点(codepoint)。码点使用16进制保存。
Uincode字符集规定一的码点为4E00。
Uincode字符集规定丁的码点为4E01。
计算机呢只能识别二进制的0和1。而UTF-8指的是编码规则,规定码点怎么保存成二进制。
还有别的Unicode编码规则,UTF-16和UTF-32。
上述表格简单描述了Unicode按UTF-8编码的格式。
首先将16进制的码点,通过进制转换为十进制然后使用十进制的数字查找上述表格处于哪个范围中,得出编码规则。然后将码点转换为2进制,从低位到高位替换x即可得到字二进制的原码将二进制的原码转换为补码存储。
java内存中的字符串采用的是unicode编码,也就是内编码。我们可以从unicode转变为GBK或UTF-8等其它规则。
代码验证猜想
以赵为例子讲解。
赵的码点为:8D75
16进制的码点转换为10进制:36213
36213处于2048-65535,得出对应的UTF-8编码格式为:1110xxxx10xxxxxx10xxxxxx
赵的16进制码点8D75转换为二进制1000
将二进制填充在1110xxxx10xxxxxx10xxxxxx中的x中,不足的补0.
111010001011010110110101。
对三个字节分别求补码为:
原码:111010001011010110110101
补码:100110001100101111001011
补码对应java中的字节数组为:{-24,-75,-75}
@Test\npublicvoidrun454()throwsUnsupportedEncodingException{\nStringstr=”赵”;\nfinalbyte[]bytes=str.getBytes(“UTF-8”);\nStringBuilderstringBuilder=newStringBuilder();\nfor(byteaByte:bytes){\nstringBuilder.append(aByte).append(“,”);\n}\nSystem.out.println(stringBuilder.toString());\n}\n
再加一个例子:
且的码点:4E14
16进制的码点转换为10进制:19988
19988处于2048-65535,得出对应的UTF-8编码格式为:1110xxxx10xxxxxx10xxxxxx
16进制的码点转换成二进制:100111000010100
原码:111001001011100010010100
补码:100111001100100011101100
补码对应的字节数组为:{-28,-72,-108}
@Test\npublicvoidrun43()throwsUnsupportedEncodingException{\n//{-28,-72,-108}\nStringstr=”且”;\nfinalbyte[]bytes=str.getBytes(“UTF-8”);\nStringBuilderstringBuilder=newStringBuilder();\nfor(byteaByte:bytes){\nstringBuilder.append(aByte).append(“,”);\n}\nSystem.out.println(stringBuilder.toString());\n}\n
GBK转码
赵的GBK码点为:D5D4十六进制码点转换为二进制:1101010111010100源码:1101010111010100补码:1010101110101100
补码对应的字节数组为:{-43,-44}
@Test\npublicvoidrun454()throwsUnsupportedEncodingException{\nStringstr=”赵”;\nfinalbyte[]bytes=str.getBytes(“GBK”);\nStringBuilderstringBuilder=newStringBuilder();\nfor(byteaByte:bytes){\nstringBuilder.append(aByte).append(“,”);\n}\n//-43,-44\nSystem.out.println(stringBuilder.toString());\n}\n
JAVA中乱码问题
java字符或字符串采用uincode作为内编码。
@Test\npublicvoidrun44(){\nStringstr=”\\u0c2c”;\n//?\nSystem.out.println(str);\n//?\nSystem.out.println(“\\u2708”);\n}\n
编码:字符串到字节。
解码:字节到字符串。
当我们读取文件的时候实际读取的是字节。然后根据文件的编码格式,将字节解码成字符串。乱码问题容易出现的地方就是这里。
不要妄想将一个乱码的字符串变成一个非乱码的。这个思路是错误的。应该从乱码之前的字节着手处理。
@Test\npublicvoidrun100()throwsUnsupportedEncodingException{\nStringstr=”张”;\nfinalbyte[]gbks=str.getBytes(“GBK”);\nfinalStrings=newString(gbks,”UTF-8″);\nSystem.out.println(s);\n}\n
上述例子中的s已经乱码了,当你操作这个s获取字节也是乱码的。
因此思路是操作gbks转换解码方式获取字符串。
最后,我自己是一名从事了多年开发的JAVA老程序员,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:[交流]即可免费获取。
作者:张攀钦
来源:掘金
好了,关于110网站源码分享和正版网站源码的问题到这里结束啦,希望可以解决您的问题哈!
