`
逆风的香1314
  • 浏览: 1453173 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA里字符编码的探索与理解

阅读更多
  众所周知,JAVA为了国际通用,用的是UNICODE来保存里面的字符。而UNICODE只是一个种字符集,字符的存储和表示要用到一定的字符编码格式,而与UNICODE对应的字符编码格式就是我们常看到的UTF-8,UTF-16等等,而UTF-8是最常用的,所以人们常常把它和UNICODE等同起来(我以前就是这样的),这在某些情况下是没有错的,但这样的理解在JAVA里就会产生一些混淆。我们用下面的程序来演示一下。
  定义一个字符串
  String name = "堂";
  这个字符串就一个字符,把它取出来
  char c_name = name.charAt(0);
  JAVA里的char型是十六位的(两个字节),但是如果是用UTF-8的话可能会不只两位(UTF-8是变长存储的),那看来JAVA本身并不是用UTF-8来保存的,口说无凭,做个实验吧。
  首先看看char里保存的内容   int low = (c_name) & 0xff;//取c_name的低位
  int high = (c_name >> 8) & 0xff;//取c_name的高位
  System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));
  结果是58 02
  只有两个字节而已(16位),那么真正的UTF-8编码的内容是什么呢,再看看吧。
  为了方便,我写了一个辅助方法printbyte,作用是把一个byte数组的每个元素按照十六进制格式打印出来,同样为了方便,我把它作为静态方法。
  public static void printbyte(byte[] bt)
  {
  for (int i = 0; i < bt.length; i++)
  {
  int hex = (int)bt[i] & 0xff;
  System.out.print(Integer.toHexString(hex) + " ");
  }
  System.out.println(" length = "+bt.length);
  }
  byte[] utf_8 = name.getBytes("utf-8");
  printbyte(utf_8);
  结果是e5 a0 82 length = 3
  哇,三个字节!看来JAVA内部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知。   byte[] utf_16 = name.getBytes("utf-16");
  printbyte(utf_16);
  结果是fe ff 58 02 length = 4,靠,四个字节了。咦?后面的低16位不正是和开始c_name的十六进制表示一样的吗?看来JAVA真正的内部字符编码和UTF-16有或多或少的联系。JAVA内部究竟是用的什么字符编码呢?这个问题我也找了很久,后来在THINK IN JAVA 3rd的12章里看到一个例子出现了UTF-16BE,难道是它?   byte[] utf_16be = name.getBytes("utf-16be");
  printbyte(utf_16be);
  结果出来了:58 02 length = 2
  哈哈,I got it!不多不少两个字节,内容也一样。果然是它。同时我在里面也看到,UNICODE的编码还有一个LE,这里的BE,LE我想应该是bigendian和littleendian吧。 
分享到:
评论

相关推荐

    JAVA里字符编码的探索与理解.txt

    ### JAVA里字符编码的探索与理解 #### 一、引言 在计算机科学领域,字符编码是将人类可读的文本转换为计算机可以处理的数据格式的过程。JAVA作为一种广泛使用的编程语言,尤其注重国际化和多语言支持,因此采用了...

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    ### Java字符谜题 Java中字符以Unicode编码,因此处理字符时需要理解Unicode的特性。例如,`'\u0061'`表示字符'a',而单引号内的字符不是字符串,而是字符常量。此外,字符和字符串的操作有特定的方法,如`charAt()...

    Java正则表达式面试题解析:探索复杂匹配规则与高效字符串处理

    Java正则表达式是编程语言Java中用于处理字符串的强大工具,它允许开发人员根据预定义的模式进行查找、替换和分割操作。以下是一系列关于Java正则表达式的面试题及其详细解析,帮助你深入理解这一关键技能。 1. **...

    编码的奥秘 计算机理解

    二进制编码是计算机理解世界的基础,包括数字、字符、颜色等。例如,ASCII码和Unicode码就是用来表示文本字符的二进制编码系统。 2. **数字编码**:计算机中的数值是通过二进制补码、原码或反码来表示的。正数的二...

    驾驭Java文件与IO:深入探索数据流的奥秘

    # 驾驭Java文件与I/O:深入探索数据流的奥秘 Java作为一种广泛应用的编程语言,在多种软件开发场景中扮演着重要角色。本文旨在深入解析Java在处理文件及I/O操作方面的能力,帮助读者更好地理解并掌握相关技术。 ##...

    164个完整的Java程序源代码

    JSP乱码问题通常涉及到HTTP头设置、页面编码声明、字符集转换等方面,解决这类问题需要对Java的IO流和字符编码有深入理解。 "javaexamples164"这个文件名可能代表了164个Java实例的集合,可能是按照主题或难度进行...

    java-API查阅

    - `OutputStreamWriter(OutputStream out)`:使用默认的字符编码创建一个`OutputStreamWriter`对象。 - **特性说明**: - 字符写入该流时会被编码成字节。 - 编码过程可能通过名称指定字符集,也可以显式指定,...

    字节流字符流练习

    除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...

    JAVA学习笔记第十四天

    Java支持多种字符编码,如ASCII、UTF-8、GBK等。了解如何在Java中正确处理不同的编码非常重要,因为这会直接影响到字符串的读取和写入,特别是在处理多语言或者非英文字符时。 接下来,我们将探讨泛型。泛型是Java ...

    JAVA初学者必须的学习资料

    通过理解和实践这些基础知识,你将能够编写出有效的程序,并为进一步探索Java的高级特性,如类、对象、接口、异常处理等奠定坚实的基础。记住,扎实的基础是成功的关键,所以花时间深入理解这些基本概念是非常必要的...

    java csdn java++

    5. **IO流与NIO**:Java的输入输出系统,包括字节流、字符流、缓冲流、对象序列化,以及Java NIO(非阻塞I/O)的介绍。 6. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait...

    编码的奥秘.pdf下载

    在计算机科学中,这通常涉及到字符编码、数据编码和程序编码等多个层面。例如,ASCII编码系统将英文字母、数字和符号映射为特定的二进制数字,使得计算机能够识别和处理文本。而更现代的Unicode(如UTF-8)则支持...

    JAVA 实用教程 耿祥义 课后编程题答案

    这样的操作不仅简洁,而且易于理解与维护。 通过以上内容,我们可以看到《JAVA 实用教程》为读者提供了全面的Java基础知识介绍,从最基本的程序结构到复杂的数据操作和控制流语句,再到方法的定义和数组的使用,每...

    应用型本科院校Java程序设计课程教学改革与探索.pdf

    其次,在教学内容方面,课程应覆盖Java编程基础、面向对象编程、常用类(如字符串、集合、文件操作等)、JDBC数据库编程、多线程编程以及Socket编程等六个主要部分。由于篇幅和课时限制,Applet编程和GUI应用等内容...

    ITjava工程师序列学习列表

    此外,理解字符编码和字符集,如UTF-8、GBK等,是处理数据交换的关键。 反射是Java的一大特性,允许运行时动态地获取类的信息并操作对象。通过java.lang.reflect.*包,你可以创建和调用未在编译时硬编码的类和方法...

    Java学习路径.pdf

    Java是一种广泛使用的高级编程语言,以其“一次编写,到处运行”的跨平台特性而著名。学习Java,首先要了解计算机语言的发展历史,以及程序中常见的错误...在实践中不断探索和理解,才能真正掌握这门强大的编程语言。

    Java入门与实例

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。本教程“Java入门与实例”旨在帮助初学者理解Java语言的基础概念并掌握实际编程技能。...祝你在Java的世界里探索愉快!

    27天成为Java大神

    在“27天成为Java大神”的学习计划中,你将深入探索Java这门强大且广泛应用的编程语言。Java以其跨平台、面向对象和高效性等特点,在软件开发领域占据着重要地位。以下是一些关键的知识点,它们是成为Java大神的...

Global site tag (gtag.js) - Google Analytics