浅谈Java中的编码理论

开发 后端
Java是使用Unicode字符集的,本文将为大家简单介绍下在Java开发中的编码理论,以及在实际开发过程中,会出现代码反馈与预期存在差异的情况。

Java是使用Unicode字符集的,意思是在内存运行的时候是这样的。当Java源程序被编译为.class文件的时候,是以UTF-8字符集存储字符的。比如字符串"汉语"的Unicode字符为:0x49 6C ED 8B。在.class文件中则变成了:0xE6 B1 89 E8 AF AD 0D 0A。实际上如果用以下程序输出“汉语”二个字的16进制字节序列:

        String str = "汉语";

        try{
              byte[] b = str.getBytes("Unicode");
              for(int i : b){
              System.out.println(Integer.toHexString(i));
        }       
        }catch(Exception ex){
              ex.printStackTrace();  }

会发现,实际输出的是 0xFE FF 6C 49 8B ED。多出来的0xFE FF,是Unicode字符串的BOM(Byte Order Mark)。但是为什么输出的顺序(0xFE FF 6C 49 8B ED)和文件中的顺序不一致(0xFF FE 49 6C ED 8B)?

public byte[] getBytes(Charset charset) 使用指定的字符集将此 String 解码为字节序列,并将结果存储到一个新的字节数组中。如果不指定参数,则使用系统默认的字符集,对于简体中文系统一般为GBK。

看程序:

class EncodingExer 
{
    public static void main(String[] args)
    {
          String str = "汉语";               //GBK编码为: 0xBABA 0xD3EF
          byte[] b = str.getBytes();     
          for(int i : b){
              System.out.println(Integer.toHexString(i)); //0xBA 0xBA 0xD3 0xEF
          }    }}

在这个过程中,由Unicode字符得到字符串“汉语”,然后解码得到了GBK字节序列。与String.getBytes()相对应的是new String(byte[] bytes,Charset charset),它的作用是用字节序列生成字符串。如果想由刚才的GBK字节序列得到原来的字符串“汉语”,我们需要做的是:new String(b) 就可以了。将b按照GBK编码得到字符串“汉语”,然后转化为Unicode字符。如果是str.getBytes("iso-8859-1"),那么还原的时候就是new String(b,"iso-8859-1")。总之就是用什么方式编码,就用什么方式解码。

【编辑推荐】

  1. Java语言中抽象类和接口的区别
  2. 痛批Java十大最无用特性
  3. 深入探索Java工作原理:JVM,内存回收及其他
责任编辑:彭凡 来源: 百度空间
相关推荐

2009-06-24 10:49:16

JavaScript

2011-03-22 09:33:39

J-Hi

2011-09-26 10:50:16

JavaScript

2012-01-13 12:21:45

Java

2011-08-04 09:35:09

Objective-C 编码规范

2012-04-26 11:39:04

Javastatic变量

2009-07-20 17:41:59

Java JDBC

2021-06-10 18:59:41

Java编程语言

2013-09-11 09:49:18

Java数组集合

2009-06-22 14:13:00

java工具javadocjar

2012-03-22 09:31:14

Java

2011-07-05 10:20:38

java

2011-07-14 15:23:34

java

2011-05-26 15:33:29

volatilejava

2011-02-24 09:27:00

Java字符集编码

2009-06-22 15:01:00

java项目常见错误

2017-08-28 15:21:29

异步处理回调函数异步编程

2009-06-26 14:04:15

Quartz配置

2011-06-28 09:51:08

.NET对象相等

2009-07-15 09:59:11

Metal观感Swing
点赞
收藏

51CTO技术栈公众号