实习中处理上传网页的东西。无奈网页的编码文件有UTF-8 和 GBK两种格式,如果不转码中文一定会乱。折腾了很久得到一点心得记录一下:
1.String类型其实无所谓编码格式,只有byte[]是有编码格式的。String 中只有全世界通用的Unicode而String str = new String(str.getBytes("..."),"...")是将str中的内容解析成相应的byte[]再将 byte按字符规则转成新的unicode存入str。
2.如果源文件是GBK的,就用GBK来读去,如果是UTF-8就要按UTF-8来读取。写入的时候只与文档打开的方式有关,写成UTF-8就要用UTF-8来打开(读取)。
比如如果是GBK的文件想写成UTF-8:
String wholeString;
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"GBK"));
while((strGBK = br.readLine())!=null){
String strGBK = new String(strGBK.getbytes("GBK"),"UTF-8");
wholeString += strGBK
}
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File("/home/xiaoyao/workFile/checkCode.txt")),"UTF-8");
或者可以写入之前做wholeString = new String(wholeString.getBytes("UTF-8"),"UTF-8");然后直接写入字符串。将字符中正确的unicode转成UTF-8的byte再写入unicode,其实我觉得很多余,但不知为什么这样做又是有效的,劝大家还是乖乖用byte数组写入。
os.write(str.getByte("UTF-8"));这样的API更放心一点
3.如果想读入字符串但怕转码过程破坏unicode,可以先用unicode读入,写之前在从unicode转成目标字符集。
String content = new String(bytes,"ISO-8859-1");
content = new String(content.getBytes("ISO-8859-1"),"UTF-8")
这样就不会有问题了。