在java中,getBytes()方法如果不指定字符集,则得到的是一个操作系统默认的编码格式的字节数组;如果指定字符集,则得到的是在指定字符集下的字节数组,如:

byte[] b_gbk = "中".getBytes("gbk");
byte[] b_utf8 = "中".getBytes("utf-8");
byte[] b_iso88591 = "中".getBytes("iso-8859-1");

将返回"中"这个汉字分别在gbk、utf-8、iso-8859-1编码下的字节数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。

与getBytes()方法相反,可以通过new String(byte[], charsetName)方法用指定的字符集来还原这个"中"字,如:

String s_gbk = new String(b_gbk, "gbk");
String s_utf8 = new String(b_utf8, "utf-8");
String s_iso88591 = new String(b_iso88591, "iso-8859-1");

通过打印出s_gbk、s_utf8、s_iso88591可以看到,s_gbk和s_utf8都是"中",而s_iso88591是一个乱码,这是因为iso-8859-1的编码表中,根本就没有包含汉字,因此"中".getBytes("iso-8859-1")得到的是"?"的字节数组表示,再通过new String(b_iso88591, "iso-8858-1")还原得到的是"?"。

有时候,为了让中文字符适应某些特殊要求(如http header要求其内容必须是iso-8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如:

String s_iso88591 = new String("中".getBytes("utf-8"), "iso-8859-1");

这样得到的字符串s_iso88591实际上是三个在iso-8859-1中的字符,在将这些字符传送到目的地后,再通过相反的方式,即:

String s_utf8 = new String(s_iso88591.getBytes("iso-8859-1"), "utf-8");

从而得到正确的中文汉字"中",这样就既保证了遵守协议规定,也支持了中文。

注:

byte[] b = "中".getBytes("utf-8");
for(int i=0; i<b.length; i++) {
  System.out.println(b[i]);
}

输出-28 -72 -83是因为"中"的utf-8编码为三个字节,分别是E4 B8 AD,以E4为例,换成二进制即为:

1110 0100

该二进制数将以补码存储在内存中,最高位被视为符号位,因此原码是:

1110 0100(补码) -> 1001 1011(反码) -> 1001 1100(原码)

即-(16+8+4)=-28

文轉:http://www.cnblogs.com/kevinq/p/4909343.html

最新文章

  1. C# i=0;i=i++,i的值是多少?
  2. 5.2 Array类型介绍
  3. 一个基于mysql构建的队列表
  4. OpenJudge计算概论-错误探测
  5. (转)SQLSERVER表分区的介绍(二)
  6. python - 文件
  7. Debain 7.2安装配置
  8. 开发该选择Blocks还是Delegates(转)
  9. G - 好老师
  10. Python数据分析扩展库
  11. UI 公钥加密
  12. 使用SLT工具从SAP导入数据到SAP HANA
  13. 关于SpringMVC中text/plain的编码导致的乱码问题解决方法
  14. java.lang.IllegalArgumentException: Result Maps collection already contains value for
  15. [十一]JavaIO之DataInputStream 和 DataOutputStream
  16. Python中return self的用法
  17. JS 一张图理解prototype、proto和constructor的关系
  18. com.mysql.jdbc.Connection.isValid(I)Z
  19. 响应式编程笔记三:一个简单的HTTP服务器
  20. HtmlHelper.Raw,&lt;%%&gt;,&lt;%:%&gt;,&lt;%=%&gt;的区别及使用

热门文章

  1. 通过ifreme实现文件上传
  2. python 获取本机ip地址的方法(Unix 平台)
  3. NetCore博客
  4. WebSphere &amp; Log4j
  5. 全球知名的HTTPS网站检测工具-Qualys SSL Labs
  6. MySQL的varchar类型注意事项
  7. hihoCoder1304:24点
  8. (转)c# Linq及Lamda表达式应用经验之 GroupBy 分组
  9. HTTP-Runoob:HTTP请求方法
  10. CSS-MUI:笔记-01