编码方式

  1. package test;
  2. import java.io.UnsupportedEncodingException;
  3. public class TestEncode {
  4. public static void main(String[] args) throws UnsupportedEncodingException {
  5. String s="编码";
  6. byte[] butf=s.getBytes("UTF-8");
  7. byte[] bgbk=s.getBytes("GBK");
  8. byte[] b8859=s.getBytes("ISO-8859-1"); //getbyte是从utf-16(因为java String 用的是utf-16) 转成其他编码方式的过程,但是 gbk的编码表与unicode表又不一样,
  9. //我只能猜测操作系统中不仅放unicode,gbk,还要放两个的对照表,http://blog.csdn.net/tge7618291/article/details/7608510 这篇文章说明确实是这样
  10. //!!!重要:只有在 string到byte才需要查对照表,byte到string 就按照各种编码方式转换成char[] 就行 这也是iso8859中文不能 string转 byte的原因
  11. PrintByte(butf);
  12. PrintByte(bgbk);
  13. PrintByte(b8859);
  14. String sutf=new String (butf,"UTF-8");
  15. String sgbk=new String (bgbk,"GBK");
  16. String siso=new String (b8859,"ISO-8859-1");
  17. System.out.println(sutf);
  18. System.out.println(sgbk);
  19. System.out.println(siso); // TODO 易出错点 输出 ??
  20. String sutf_gbk=new String (butf,"GBK");
  21. System.out.println(new String (sutf_gbk.getBytes("GBK"),"UTF-8")); // TODO 输出编码
  22. //这个代码块案例下面会讲解
  23. String ss="编";
  24. PrintByte(ss.getBytes("UTF-8"));
  25. sutf_gbk=new String (ss.getBytes("UTF-8"),"GBK");
  26. System.out.println(sutf_gbk);
  27. PrintByte(sutf_gbk.getBytes("GBK"));
  28. System.out.println(new String (sutf_gbk.getBytes("GBK"),"UTF-8")); //TODO 输出 �?
  29. String sutf_ISO=new String (butf,"ISO-8859-1");
  30. System.out.println(new String (sutf_ISO.getBytes("ISO-8859-1"),"UTF-8")); //TODO 输出 编码 ISO-8859-1 是单字节编码,所以byte[] 用ISO-8859-1转成String,再反转成原来的byte[],再解析成String 不会乱码
  31. }
  32. public static void PrintByte(byte[] b){
  33. for(byte bs:b){
  34. System.out.print(bs+"/");
  35. }
  36. System.out.print("\n");
  37. }
  38. /*
  39. 编码:String和char 在内存当中统一用 UTF-16 即标准的Unicode编码方式
  40. String.getbyte ( charset ) 按照unicode 对应到 指定 charset 的方式, 把String 转换成 charset 对应的byte数组
  41. "中" print byte[] : UTF-8: -28/-72/-83/
  42. GBK: -42/-48/
  43. ISO-8859-1:63/ 因为ISO-8859-1 没有中文编码,超过了范围就会变成 3F即 63也就是‘?’字符 !! ISO-8859-1只能用于byte[] 到String的转换
  44. new String (byte[] , charset) 把byte[] 按照指定编码格式解析成String,
  45. 案例
  46. String s="编";
  47. byte[] butf=s.getBytes("UTF-8");
  48. String s4=new String (butf,"GBK");
  49. String s5=new String (s4.getBytes("GBK"),"UTF-8");
  50. System.out.print(s5); 输出 �?
  51. --------------------
  52. String s="编码";
  53. byte[] butf=s.getBytes("UTF-8");
  54. String s4=new String (butf,"GBK");
  55. String s5=new String (s4.getBytes("GBK"),"UTF-8");
  56. System.out.print(s5); 输出 编码
  57. GBK与UTF-8的互转会出现不可预知的错误,这个错误是因为string 转utf-8 是变长,可能出现奇数数目的byte数组,
  58. 而奇数数目的数组在byte转string时就不符合gbk的规范因为gbk是二长的编码,就可能会丢失几位,所以乱码
  59. String Byte[]的转换最好还是 UTF-8与ISO-8859 GBK与ISO-8859的转换
  60. */
  61. /*原则就是
  62. * string就是utf-16 的byte,
  63. string 到 byte 需要查编码表,而byte到string按照各编码集规则自行编码,
  64. */
  65. }






posted on 2017-09-10 15:17  wks_keshan  阅读(123)  评论(0)    收藏  举报