在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

getBytes()详解.RP的更多相关文章

  1. HttpServletResponse和HttpServletRequest详解.RP

    HttpServletResponse,HttpServletRequest详解 1.相关的接口   HttpServletRequest HttpServletRequest接口最常用的方法就是获得 ...

  2. getBytes()详解

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

  3. ServletContext作用功能详解.RP

    ServletContext ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而s ...

  4. HTML5应用程序缓存Application Cache详解.RP

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  5. new String(str.getBytes(“gbk”),“gbk”)的用法详解

    new String(str.getBytes(“gbk”),“gbk”)的用法详解 前提是str存放的是汉字 一.如果是new String(str.getBytes(“gbk”),“gbk”)时, ...

  6. Java中getBytes()方法--使用详解

    getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...

  7. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  8. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  9. WebApi 接口参数不再困惑:传参详解

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.后台发送请求参数的 ...

随机推荐

  1. CodeForces - 651D:Image Preview (双指针&)

    Vasya's telephone contains n photos. Photo number 1 is currently opened on the phone. It is allowed ...

  2. freemarker实现第一个HelloWorld

    第一步:引入freemarker jar包 第二步:创建templates下的test01.ftl 第三步:在web.xml下 第四步:编写后台代码 package com.wisezone.test ...

  3. TreeView的性能问题

    最近在帮同事调试一个类似资源管理器的wpf界面,左边TreeView去遍历大目录时UI卡死,刚开始我以为是在UI线程中调用系统API遍历目录的原因,就改为后台遍历,但是没有效果. 根本原因: Tree ...

  4. hihoCoder#1122(二分图最大匹配之匈牙利算法)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可 ...

  5. 【转】LTE-NAS过程学习总结

    为了从网络得到非接入层服务,网络中非接入层节点必须知道有关UE的信息.为了这个目的,UE不得不发起附属过程,该过程是在UE开机和初始接入网络时必须被执行的. 一旦该过程成功,MME上就会建立好一个该U ...

  6. Python:序列的copy() 方法和 copy 模块

    转于:Python中copy和deepcopy中的区别 博主:assan 一.序列中的 copy() 方法 # 此方法为浅度复制:复制的数会随着被复制数的嵌套序列的元素的改变而改变: # 功能:将一个 ...

  7. 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务

    目录(?)[-] Client的AIDL文件 Client的代码 建立连接 请求服务 断开连接 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://bl ...

  8. java流类共享篇

    总结: package com.aini; import java.io.*; import java.util.StringBuffere; public class tyt { public st ...

  9. AngularJS:SQL

    ylbtech-AngularJS:SQL 1.返回顶部 1. AngularJS SQL 在前面章节中的代码也可以用于读取数据库中的数据. 使用 PHP 从 MySQL 中获取数据 AngularJ ...

  10. 编译适用于TP-Link WR703N的OpenWRT固件

    编译适用于TP-Link WR703N TP-Link MR11U 以及使用AR9331芯片组的单WAN/LAN复用口的路由. 注:刷机有风险,刷机需谨慎.一般情况下是不会失败的,若无法通过捅Rese ...