ew String(bytes_utf8,"UTF-8"); 使用“UTF-8”编码标准类解析这个字节数组。 System.out.println("字节数组{-26,-79,-119}表示汉字:" + str); 输出结果: 字节数组{-26,-79,-119}表示汉字:汉。 其中这三个数字都是以十进制表示的整数,如果想以十六进制查看只需要用 Integer.toHexString 就可以转化成十六进制了,可以测试,它们与“6C”和“49”这两个“汉” 的 U
NICODE 码差了很远。 使用同样方法,可以分别得到“汉”这个字使用 GBK 编码时所得到的字节数组 String str = "汉" ; byte [] str_gbk_bytes = str.getBytes("GBK"); 得到的字节数组为{-70-70},结果告诉我们“汉”这个字以 GBK 编码的时候产生了两个 字节,这两个字节分别存放的是-70 和-70。同样可以使用上面的方法还原,读者可以自己测 试。 注意:\uXXXX 格式是 Java
常用的。它这种格式转化和这里的编码并不是一回事。因为 不可能将\uXXXX 直接写入文件。写入文件之后可能 Java 系统可以识别,但其他平台就未必 了。而使用 UTF-8 和 GBK 则可以和其他平台进行
通信。 特别强调: 同一个字使用不同的编码得到的字节数组的值可能不一样 (这样说是因为有 些编码之间有兼容关系,可能是一样的) ,虚拟机中的字符串并不是以某种可写入文件的编 码格式存储的,而是以 UNICODE 值存放的。要写入文件或者发送到网络传输线上面都是需 要进行转码的, 转码的方法就是 String.getBytes()方法, 给一个编码名称做参数就得到了该编 码下这个字符串的字节数组了。还原的时候是使用 String 的构造方法,但是你必须知道这个 字节数组是以哪种格式编码的,不然系统不能正确读取。刚才已经得知{-70,-70}这个字节数 组是“汉”这个字以 GBK 编码时得到的字节数组。如果你使用 String str = new String(new byte[]{-70,-70},”utf-8”)来还原,肯定是会出乱码的。 以上就介绍完了 JRE 之中关于编码的知识,也简单介绍了编码与编码之间的转化。 //使用字节数组创建字符串, 并且告诉系统
UNICODE 可以作为一个中间标准,因为 JRE 已经完成了 UNICODE 与任意编码之间的转换功 能,这样就可以完成不同编码之间的转化功能。
WEB 系统中编码问题的出现
JSP 页面中设置编码 在 WEB 系统的通信模式中,出现编码转换的地方很多。浏览器向服务器发送一次请求 的数据包中,就有三个地方涉及到编码问题。 它们分别是:URL、URL 后面的参数以及表单。 通常情况下 URL 和 URL 后面的参数都不会出现中文字符,在没有中文字符的时候是不 存在乱码问题的,因为所有编码标准中对于英文字符的码值都是一样的。而当 URL 和 URL 中参数出现中文的时候,编码问题就相当棘手。 首先是 URL 路径中如果出现中文,形如 baidu/pro/查询.jsp 的 URL 字符 串,浏览器访问的是一个中文文件名的 JSP 文件“
查询.jsp” 。浏览器在发送请求的时候会将 路径中的中文经过转码。首先假设浏览器以 UTF-8 转码。 “查询”这两个汉字得到的字节数 组为{-26,-97,-91,-24,-81,-94}。这里-26 是个负数,并不能直接转化成十六进制。这其中涉及 到
数字编码的问题(原码、反码和补码的知识是
计算机组成原理中涉及的) 。只需要知道, 浏览器将这六个数字转化成了六组十六进制字符串, 且一个字符串只有两个字符, 并且最后 以“%”来连接。转化的结果是“%E6%9F%A5%E8%AF%A2” 。也就是说,转码之后出现的每 一个字节,都以%XX 的形式表示,XX 表示这个字节所代表的十六进制数。注意一个问题, 26 和-26 转化成的结果肯定是不一样的。至于这里到底怎么转的,需要详细了解原码、反码 和补码的知识。以范围来说 0x00-0xFF 表示的范围刚好是一个字节表示的范围,而一个字节 表示的整数范围是-128 到 127。[-128,127]与[0x00,0xFF]是有一个对应关系的,并