读书人

java中关于字符、资料乱码的笔记

发布时间: 2012-10-06 17:34:01 作者: rapoo

java中关于字符、文件乱码的笔记

?

老生常谈的问题了,记录一下以便他人翻阅。

?

结论:

1.???????字符串与byte数组的转换?默认编码是采用系统的编码(例如Windows下是GB18030)

2.???????java类文件中本身包含的字符串,采用什么编码是?根据javac编译时的环境变量决定的。

?

穿插一下:

?

重复一下http中的中文乱码问题,例如使用prototype.js发送包含中文的ajax报文时,Servlet接收端可能会遇到乱码问题。该情况可以用以下api解决:

ServletRequest.setCharacterEncoding

ServletResponse.setCharacterEncoding

?

程序代码:

?

Java代码??java中关于字符、资料乱码的笔记
  1. /**?
  2. ?*??
  3. ?*?@author?csbison?
  4. ?*/??
  5. public?class?BTest?{??
  6. ??
  7. ????private?final?static?char[]?hexDigits?=?{?'0',?'1',?'2',?'3',?'4',?'5',??
  8. ????????????'6',?'7',?'8',?'9',?'a',?'b',?'c',?'d',?'e',?'f'?};??
  9. ??
  10. ????/**?
  11. ?????*?@param?args?
  12. ?????*/??
  13. ????public?static?void?main(String[]?args)?{??
  14. ????????//?测试证明,?字符串与byte数组的转换,默认就是用系统平台的??
  15. ????????try?{??
  16. ????????????String?src?=?"诺基亚";??
  17. ????????????String?value?=?null;??
  18. ????????????value?=?bytesToHexString(src.getBytes());??
  19. ????????????System.out.println("Default="?+?value);??
  20. ??
  21. ????????????value?=?bytesToHexString(src.getBytes("ISO-8859-1"));??
  22. ????????????System.out.println("ISO-8859-1="?+?value);??
  23. ??
  24. ????????????value?=?bytesToHexString(src.getBytes("GBK"));??
  25. ????????????System.out.println("GBK="?+?value);??
  26. ??
  27. ????????????value?=?bytesToHexString(src.getBytes("UTF-8"));??
  28. ????????????System.out.println("UTF-8="?+?value);??
  29. ??
  30. ????????????System.out.println("/////////////////////////");??
  31. ??
  32. ????????????byte[]?aa?=?"诺基亚".getBytes();??
  33. ????????????System.out.println(new?String(aa));??
  34. ????????????System.out.println(new?String(aa,?"GBK"));??
  35. ????????????System.out.println(new?String(aa,?"ISO-8859-1"));??
  36. ????????????System.out.println(new?String(aa,?"UTF-8"));??
  37. ????????}?catch?(Exception?e)?{??
  38. ????????????e.printStackTrace();??
  39. ????????}??
  40. ??
  41. ????}??
  42. ??
  43. ????public?static?final?String?bytesToHexString(byte[]?buf)?{??
  44. ????????StringBuffer?sb?=?new?StringBuffer();??
  45. ????????for?(int?i?=?0;?i?<?buf.length;?i++)?{??
  46. ????????????int?n?=?buf[i];??
  47. ????????????if?(n?<?0)?{??
  48. ????????????????n?=?256?+?n;??
  49. ????????????}??
  50. ????????????int?d1?=?n?/?16;??
  51. ????????????int?d2?=?n?%?16;??
  52. ??
  53. ????????????sb.append(hexDigits[d1]);??
  54. ????????????sb.append(hexDigits[d2]);??
  55. ????????}??
  56. ????????return?sb.toString();??
  57. ????}??
  58. ??
  59. }??
?

?

Windows上的测试结果:

Default=c5b5bbf9d1c7

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/////////////////////////

诺基亚

诺基亚

?|ì?¨′??

???

?

Linux上的测试结果:

1.???????在Locale=zh的情况下,javac,然后再java执行。结果如下:

-bash-3.00$ java BTest

Default=c5b5bbf9d1c7

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/////////////////////////

诺基亚

诺基亚

???ù??

???

2.???????在Locale=C的情况下,直接java执行(也就是java文件还是在Locale=zh的环境下编译的)。结果如下:

-bash-3.00$ java BTest??

Default=3f3f3f

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/////////////////////////

???

???

???

???

?

3.???????在Locale=C的情况下,javac,然后再java执行。结果如下:

-bash-3.00$ java BTest??????

Default=c5b5bbf9d1c7

ISO-8859-1=c5b5bbf9d1c7

GBK=3f3f3fa8b43f3f

UTF-8=c385c2b5c2bbc3b9c391c387

/////////////////////////

诺基亚

???

诺基亚

???

?

?

关于对字符编码的问题,可以参考:

http://www.utf.com.cn/article/s320????????????????????UTF-8?字符集基础(1

http://www.phpweblog.net/XBOX/archive/2008/09/06/5726.html

http://javajiao.iteye.com/blog/151995??

?

读书人网 >编程

热点推荐