我对Java字符串的解码和编码感到困惑。
现在我有一个字符串变量"中国",意思是中国,它包含在中文本地字符集GB2312中,也包含在Unicode中。
那么,以下内容有什么区别呢?
val f = "中国"
println(new String(f.getBytes("GB2312"),"GB2312"))
println(new String((new String(f.getBytes("GB2312"),"UTF8")).getBytes("UTF8"),"GB2312") ) 发布于 2018-04-24 12:10:09
它的行为是这样的,因为只有当new String(x, "UTF8").getBytes("UTF8")实际上是UTF-8字符串的有效字节表示时,x的输出才会是x。否则,根据String
此方法总是用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列。
UTF-8的默认字符是�(位表示�).f.getBytes("GB2312")返回以下位序列:11010110 11010000 10111001 11111010。与一个无效字符一样,后面跟着11010000 10111001或й,然后是另一个无效字符。new String(f.getBytes("GB2312"),"UTF8")的输出用于�й�,或转换为二进制形式的11101111 10111111 10111101 11010000 10111001 11101111 10111111 10111101。
11010110和11111010是无效的,因为任何以表单11xxxxxx的字节开头的字节序列都必须后面跟着表单10xxxxxx中的一个或多个字节(确切的数字取决于第一个数字开头的1数)。有关UTF-8格式的更多细节,请参见维基百科。
发布于 2018-04-29 14:35:35
简单地说,new String(s.getBytes("UTF8"),"GB2312") )没有做你认为它做的事情。(我不知道你认为它会起什么作用,但它不能带来什么好处,所以我猜想。)
它的意思是:使用UTF-8从字符串中编码文本,然后获取这些字节并对它们进行解码,就好像它们是使用GB2313编码的文本一样。
https://stackoverflow.com/questions/49999192
复制相似问题