为什么用iso-8859-1来转换字符集
在学习的时候,记得总是使用iso-8859-1来转换字符集。当时也没注意,今天又碰到中文乱码,查了下iso-8859-1,大概明白了一些。
- 在java本身读取不到系统字符集的时候,默认使用的iso-8859-1
- iso-8859-1是单字节表示,所以无法表示255之上的字节,比如中文作为String输出的时候就会乱码,但是我们可以通过new String(iso_bytes, charset)的方法来得到正确的中文。
- 转换的时候getBytes和new String(byte[], charset)应该是相同的,才可以正确还原String内容。但是如果是iso-8859-1不能针对一个字符进行解码,那么就不可能再还原出来。
- 但是有一种情况来说,就可以实现字符集的转换,这就是先把文件内容转换成String到java内存中,然后就可以以任何字符集进行读出来。道理很简单,因为java本身String没有编码,内部使用的是utf-16存储,所以不论什么字符集到java的String里,都会变成utf-16存储,但是java负责从utf-16到其他字符集的对应关系,所以都出来的不乱码。
所以来说,我们需要保证写和读的字符集是相同的,并且存储的字符集可以正确编码这些内容(ISO-8859-1就不能编码中文),才可以保证中文的不乱码.
但是在java中,String是使用unicode表示,没有字符集的区别。所以我们可以从任何支持与unicode转换的字符集来互相转换,包括iso-8859-1.就像是Java提供了一个中间的标准编码字典,同时提供与各个字符集的转换对照表一样。所以我们在转换的时候,只需要getBytes时候选同样的字符集,就能解析出来同样的byte数组,然后交给unicode去自己对照设置的字符集,组成unicode.
PS:
- 在XFTP上传时候选择utf8,但是只是针对名称进行了utf8转化,内容还是gbk的。