Java中字符编码和字符串所占字节数 .

转载 2012年03月21日 17:25:15
 

Java中字符串所占的字节数和字符编码密切相关。

Java编码实际上可以涉及这几个方面的知识:IDE的编码,操作系统默认编码,Java字符编码。

例如:我们使用eclipse编写Java程序时,可以在工程属性中设置Java程序的编码,若不设置,则程序的编码默认是操作系统的编码,这里设置的编码即为代码文件的编码;或者我们使用vim编写Java程序时,可以设置系统的环境变量LANG,例如 zh_CN.UTF-8,zh_CN.GB18030等,此时,代码文件的编码就是LANG所指定的编码。这就是IDE的编码,IDE的编码很重要,例如一个Java代码文件是UTF-8编码的,而你的IDE是GB18030编码,则显示就会出现乱码了。

Java中字符的编码是指Java中的字符串所采取的编码,例如有下面一段程序,用于计算字符串所占字节数,运行在Windows 7上:

  1. public class Charset {  
  2.   
  3.         public static void main(String[] args) {  
  4.                 // TODO Auto-generated method stub   
  5.                 String msg = "中国abc";  
  6.                 System.out.println(msg);  
  7.                 int len = msg.getBytes().length;//按操作系统默认编码来编码   
  8.                 System.out.println(len);  
  9.                 try{  
  10.                         len = msg.getBytes("GB2312").length;//输出7   
  11.                         System.out.println("GB2312: "+len);  
  12.                         len = msg.getBytes("GBK").length;//输出7   
  13.                         System.out.println("GBK: "+len);  
  14.                         len = msg.getBytes("GB18030").length;//输出7, 2*2+3,一个汉字占2字节,一个英文字母一个字节   
  15.                         System.out.println("GB18030: "+len);  
  16.                         len = msg.getBytes("UTF-8").length;//输出9, 2*3+3=9,一个汉字占3字节,一个英文字母一个字节.   
  17.                         System.out.println("UTF-8: "+len);  
  18.                         len = msg.getBytes("UTF-16").length;//输出12   
  19.                         System.out.println("UTF-16: "+len);  
  20.                         len = msg.getBytes("UTF-32").length;//输出20   
  21.                         System.out.println("UTF-32: "+len);  
  22.                         len = msg.getBytes("Unicode").length;//输出12   
  23.                         System.out.println("Unicode: "+len);  
  24.                 } catch ( java.io.UnsupportedEncodingException e)  
  25.                 {  
  26.                         System.out.println(e.getMessage().toString());  
  27.                 }  
  28.         }  
  29.   
  30. }  

程序输出是:

中国abc
7
GB2312: 7
GBK: 7
GB18030: 7
UTF-8: 9
UTF-16: 12
UTF-32: 20
Unicode: 12

分析:
len = msg.getBytes().length 的值是7,这是因为Windows 7操作系统字符编码是GBK(GB2312或GBK或GB18030),Java在运行程序时以操作系统默认编码来编码字符,所以字符所占字节数是7。

若该段程序放在,

  1. [zhankunlin@IctHTC javatest]$ export LANG=zh_CN.GB18030  
  2. [zhankunlin@IctHTC javatest]$ vim Charset.java  (编写Java代码文件时,使用的编码是zh_CN.GB18030,即代码文件中的编码是 GB18030)  
  3. [zhankunlin@IctHTC javatest]$ javac Charset.java   
  4. [zhankunlin@IctHTC javatest]$ java Charset  (LANG=zh_CN.GB18030,即系统默认编码是GB18030)  
  5. 中国abc  
  6. 7 (系统默认编码是GB18030,所以占7个字节)     
  7. GB2312: 7  
  8. GBK: 7  
  9. GB18030: 7  
  10. UTF-8: 9  
  11. UTF-16: 12  
  12. UTF-32: 20  
  13. Unicode: 12  
  14. [zhankunlin@IctHTC javatest]$ export LANG=zh_CN.UTF-8 (更改系统编码为 UTF-8 )  
  15. [zhankunlin@IctHTC javatest]$ java Charset  
  16. 涓..abc  (由于XShell终端编码没有设置成 UTF-8,所以打印出现乱码)  
  17. 9 (操作系统编码是UTF-8,所以占9个字节)  
  18. GB2312: 7  
  19. GBK: 7  
  20. GB18030: 7  
  21. UTF-8: 9  
  22. UTF-16: 12  
  23. UTF-32: 20  
  24. Unicode: 12  
  1. {设置XShell终端编码为 utf-8 }  
  1. [zhankunlin@IctHTC javatest]$ java Charset  
  2. 中国abc  (打印正常)  
  3. 9  
  4. GB2312: 7  
  5. GBK: 7  
  6. GB18030: 7  
  7. UTF-8: 9  
  8. UTF-16: 12  
  9. UTF-32: 20  
  10. Unicode: 12  
  11. [zhankunlin@IctHTC javatest]$ vim Charset.java   
  1. [zhankunlin@IctHTC javatest]$ javac Charset.java  (程序代码文件编码是 GB18030,而编译时系统编码是 UTF-8,编译器编译时若没有任何指定就会以操作系统编码的方式去读取代码文件进行编译,所以出现警告)  
  2. Charset.java:6: 璀?.锛.??.UTF8 ?.??..灏..绗  
  3.                 String msg = "锟叫癸拷abc";  
  4.                               ^  
  5. Charset.java:6: 璀?.锛.??.UTF8 ?.??..灏..绗  
  6.                 String msg = "锟叫癸拷abc";  
  1. [zhankunlin@IctHTC javatest]$ javac -encoding gb18030 Charset.java  (使用 -encoding 选项指定程序文件的编码格式,则编译不会出问题)  
  2. [zhankunlin@IctHTC javatest]$ java Charset {打印正常,因为XShell终端编码已经设置为了 utf-8 }}  
  3. 中国abc  
  4. 9  
  5. GB2312: 7  
  6. GBK: 7  
  7. GB18030: 7  
  8. UTF-8: 9  
  9. UTF-16: 12  
  10. UTF-32: 20  
  11. Unicode: 12  
  1. <pre>  
  1. </pre><pre name="code" class="plain">  
  1. </pre><pre name="code" class="plain">  
  1. </pre><pre name="code" class="plain"><pre>  

相关文章推荐

Java字符串所占字节数的小总结

首先,char为Java的基本类型,基本类型所占的字节数是固定的,如int占4字节,double占8字节,这可以使得Java在不同的平台上所占类型固定,很好地保证了Java的可移植性。因此,Java中...

Java String类型数据的字节长度

问题描述:         向数据库中插入一条String类型的数据,在数据库中该字段定义为varchar2(64),一开始使用String.length()来进行数据的长度校验,如果数据是纯英文,那...

java简单的字符串大小比较——compareTo()方法

在java编程中,我们会偶尔遇到字符串大小比较的问题,compareTo()方法很简单就实现这种功能。该方法用于判断一个字符串是大于、等于还是小于另一个字符串。判断字符串大小的依据是根据它们在字典中的...

Java String类型含普通字符以及中文字符,计算等价的中文字符串长度

/* 获取中文字符串的长度 我的12 = 3 我的1 = 3 我的123456 = 5 */ public int getChineseStrLen(String s...

Java中英文混和字符串长度计算

在JAVA中字符占二字节,数据库中中文占二字节,英文和其他占一个.那么怎么去验证??比如数据库有50字符大小,那么写入时字串长度怎么去控制?=============String a="你好123";...
  • flyjimi
  • flyjimi
  • 2006年01月04日 17:19
  • 6860

java 判断含有中文的字符串的长度

public static boolean isLetter(char c) { int k = 0x80; return c / k == 0 ? true : ...

Java 比较字符串之间大小

LZ-Says:心态调整好~啥事儿都得开开心心的~ 前言公司让实现一个自动清除1小时内数据,SQL不熟悉,无奈之下,只能本地DB存储当前时间+小时去和当前时间进行比对。折腾好半天,突然想到Java提供...

获取字符串的字节数,而不是字符长度

String ss="hello"; byte[] buff=ss.getBytes(); int f=buff.length; System.out.println(f);

java中基本类型占用字节数

在移动开发中由于移动设备内存的局限性,往往需要考虑使用的数据类型所占用的字节数。下面简单介绍下Java中几种基本数据类型,以加深记忆。 在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类...

Java bit、byte、位、字节、汉字、字符

============================================================================== package com.suypower....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中字符编码和字符串所占字节数 .
举报原因:
原因补充:

(最多只允许输入30个字)