java enum

Posted on

java enum

Java代码 收藏代码

  1. public enum Operation {
  2. PLUS { double eval(double x, double y) { return x + y; } },
  3. MINUS { double eval(double x, double y) { return x - y; } },
  4. TIMES { double eval(double x, double y) { return x /* y; } },
  5. DIVIDE { double eval(double x, double y) { return x / y; } };
  6. // Do arithmetic op represented by this constant
  7. abstract double eval(double x, double y);
  8. public static void main(String args[]) {
  9. double x = Double.parseDouble("3");
  10. double y = Double.parseDouble("2");
  11. for (Operation op : Operation.values())
  12. System.out.printf("%f %s %f = %f%n", x, op, y, op.eval(x, y));
  13. System.out.println(Operation.valueOf("PLUS").eval(x, y));
  14. }
  15. }
  16. public enum RandomStr {
  17. ///
  18. /* 只有数字
  19. /*/
  20. Number("0123456789"),
  21. ///
  22. /* 包含数字和大小写字符
  23. /*/
  24. NumberAndChar("abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ"),
  25. ///
  26. /* 包含数字和大写字符
  27. /*/
  28. NumberAndCharIgnoreCase("ABCDEFGHJKLMNPQRSTUVWXYZ23456789"),
  29. ///
  30. /* 数字和字符平均出现
  31. /*/
  32. AvgNumberAndCharIgnoreCase(
  33. "ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789");
  34. ///
  35. /* 原始值
  36. /*/
  37. private String original;
  38. ///
  39. /* 产生指定长度的随机码。
  40. /*/
  41. public String rand(int length) {
  42. String codes = "";
  43. if (length > 0) {
  44. int max = original.length();
  45. long seed = System.currentTimeMillis();
  46. Random random = new Random(seed);
  47. for (int i = 0; i < length; i++) {
  48. codes += original.charAt(random.nextInt(max));
  49. }
  50. }
  51. return codes;
  52. }
  53. ///
  54. /* 私有构造器。
  55. /*/
  56. private RandomStr(String original) {
  57. this.original = original;
  58. }
  59. }
    注意:JDK4.0以前的都不支持,转成5.0以上才支持 jdk5.0发布以后,添加了枚举类型,其实当初在从Delphi转向Java的时候,我就在为java中没有枚举这个功能感到不可思议。因为枚举类型在很多方面有着独特作用,现在好了,java中添加了这项功能,今天我就试了试,还满好的。

java中的枚举类型包括了其他语言中枚举类型的一般特性。 class EnumDemo{ public enum Seasons { winter,spring,summer,fall; }

public static void main(String[] args){ 

   for(Seasons s:Seasons.values()) 
    System.out.println(s); 

    } 

} 运行结果: winter spring summer fall 上面这个例子,展示了枚举类型的一般用法,在java的枚举类中提供了静态values()方法以供循环迭代时使用。大家再看一看下面这个例子: public enum Seasons { winter, spring, summer, fall; //list the values public static void main(String[] args) { for(Seasons s:Seasons.values()) { System.out.println(s); } } } 这两个例子得出的是一样的结果。由此可知enum关键字是代表一个类相当于class的意思,但是它又比class的范围要小,仅仅代表枚举类而已。 java中的枚举类除了有这些一般的功能外还包括一些特殊的功能,例如:枚举类型可以有构造函数、可以添加任意多的方法和属性;同时枚举类型还可以为不同的属性添加不同的方法。 在这里我们假设你希望向一个枚举类中添加数据和行为。例如我们可以设想一下银河系的星球。每个星球的它自己的特定数据,由此来计算物体在其表面上的重量。下面就是实例: public enum Planet { MERCURY (3.303e+23, 2.4397e6), //水星 VENUS (4.869e+24, 6.0518e6), //金星 EARTH (5.976e+24, 6.37814e6), //地球 MARS (6.421e+23, 3.3972e6), //火星 JUPITER (1.9e+27, 7.1492e7), //木星 SATURN (5.688e+26, 6.0268e7), //土星 URANUS (8.686e+25, 2.5559e7), //天王星 NEPTUNE (1.024e+26, 2.4746e7), //海王星 PLUTO (1.27e+22, 1.137e6); //冥王星 private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { //枚举类不需要被实例化,所以构造器是私有的private,不加默认为私有类型 this.mass = mass; this.radius = radius; } public double mass() { return mass; } public double radius() { return radius; } // universal gravitational constant (m 3 kg -1 s-2) public static final double G = 6.67300E-11; public double surfaceGravity() { return G / mass / (radius / radius); } public double surfaceWeight(double otherMass) { return otherMass / surfaceGravity(); } public static void main(String[] args) { double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/EARTH.surfaceGravity(); for (Planet p : Planet.values()) System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } } 运行结果: C:\java>java Planet 60 Your weight on MERCURY is 22.665457 Your weight on VENUS is 54.299946 Your weight on EARTH is 60.000000 Your weight on MARS is 22.724231 Your weight on JUPITER is 151.833452 Your weight on SATURN is 63.960932 Your weight on URANUS is 54.307632 Your weight on NEPTUNE is 68.299684 Your weight on PLUTO is 4.012468 在这里我们可以看到这个枚举类中含有一个带有两个参数的构造函数。通过构造函数我们可以产生含有不同数据特征的星球对象。Planet 的构造函数参数值从枚举常量里获取,如: 当遍历到水星时 MERCURY (3.303e+23, 2.4397e6), //水星 就会把里面的值3.303e+23传给mass, 而2.4397e6传给radius Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } 在main()函数中,我们通过有不同的星球调用相同的方法来得到物体在该星球上的重量。 我们可以把为枚举常量添加行为的主意更向前推进一步。我们可以为不同枚举常量添加不同的行为。通过使用switch语句是达到这个目的的一种方法。下面就有一个实例: public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // Do arithmetic op represented by this constant double eval(double x, double y){ switch(this) { case PLUS: return x + y; case MINUS: return x - y; case TIMES: return x / y; case DIVIDE: return x / y; } throw new AssertionError("Unknown op: " + this); } } 它工作的非常好,当时如果没有throw语句的话,它将不能通过编译,因此它就显得不是那么完美了。更加糟糕的是,你一定要记住在你向枚举类中添加枚举变量时,你要为这个变量添加操作。如果你忘了的话,eval方法将会操作失败。 这里有另外一种给枚举常量添加行为的方法。使用这种方法你可以避免上面说提到的问题。你可以在枚举类型中添加一个abstract方法,然后在每一个枚举常量中重载它。这就是有名的constant-specific方法。下面就是用这种技术对以前实例的重写: public enum Operation { PLUS { double eval(double x, double y) { return x + y; } }, MINUS { double eval(double x, double y) { return x - y; } }, TIMES { double eval(double x, double y) { return x / y; } }, DIVIDE { double eval(double x, double y) { return x / y; } }; // Do arithmetic op represented by this constant abstract double eval(double x, double y); public static void main(String args[]) { double x = Double.parseDouble(args[0]); double y = Double.parseDouble(args[1]); for (Operation op : Operation.values()) System.out.printf("%f %s %f = %f%n", x, op, y, op.eval(x, y)); } } 运行结果: C:\java>java Operation 24 56 24.000000 PLUS 56.000000 = 80.000000 24.000000 MINUS 56.000000 = -32.000000 24.000000 TIMES 56.000000 = 1344.000000 24.000000 DIVIDE 56.000000 = 0.428571 大家可能会不太明白“PLUS { double eval(double x, double y) { return x + y; } }”的意思。其实如果大家理解内部类的话,可能就不难理解这句话的含义了。我的理解是: class MyenumOperation implements enumOperation { double eval(double x, double y) { return x + y; } } MyenumOperation plus = new MyenumOperation(); 与枚举类型一起添加进来的还有enumset和enummap,我会在下一篇文章中介绍。 Enum是enumeration(列举)的简写形式,包含在java.lang包中.熟悉C, C++, C /#, 或 Pascal人应该对列举有所了解,先看个例子: public enum Season { winter, spring, summer, fall } 一个enum是定义一组值的对象,它可以包括零个或多个值成员.它是属于enum类型的,一个enum对象中不可有两个或多个相同的属性或值.在次之前的java程序员一般是 用接口的方法实现列举的,如 : public interface Season { static winter = 0; static spring = 1; //etc.. } 引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都回自动获得一个数字值,从0开始,依次递增.看一个比较简单的enum实现的例子: EnumDemo.java package net.javagarage.enums; // We can loop over the values we put into the enum using the values() method. Note that the enum Seasons is compiled into a separate unit, called EnumDemo$Seasons.class // public class EnumDemo { //declare the enum and add values to it. note that, like in C/#, we don't use a ; to end this statement and we use commas to separate the values // private enum Seasons { winter, spring, summer, fall } //list the values public static void main(String[] args) { for (Seasons s : Seasons.values()){ System.out.println(s); } } } 运行上述代码你回得到 以下结果: winter spring summer fall Enum的属性调用: 下面的代码展示了调用enum对象的方法,这也是它通常的用法: package net.javagarage.enums; // File: EnumSwitch.java Purpose: show how to switch against the values in an enum. // public class EnumSwitch { private enum Color { red, blue, green } //list the values public static void main(String[] args) { //refer to the qualified value doIt(Color.red); } //note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a compiler error // private static void doIt(Color c){ switch (c) { case red: System.out.println("value is " + Color.red); break; case green: System.out.println("value is " + Color.green); break; case blue: System.out.println("value is : " + Color.blue); break; default : System.out.println("default"); } } } 为enums添加属性和方法 enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. package net.javagarage.enums; // File: EnumDemo.java Purpose: show how to use an enum that also defines its own fields and methods /*/ public class EnumWithMethods { //declare the enum and add values to it. public enum Season { winter, spring, summer, fall; private final static String location = "Phoenix"; public static Season getBest(){ if (location.equals("Phoenix")) return winter; else return summer; } public static void main(String[] args) { System.out.println(Season.getBest()); } } 就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错. Enums构造函数: 和类一样enums也可以有自己的构造函数,如下: package net.javagarage.enums; public class EnumConstructor { public static void main(String[] a) { //call our enum using the values method for (Temp t : Temp.values()) System.out.println(t + " is : " + t.getValue()); } //make the enum public enum Temp { absoluteZero(-459), freezing(32), boiling(212), paperBurns(451); //constructor here Temp(int value) { this.value = value; } //regular field?but make it final, //since that is the point, to make constants private final int value; //regular get method public int getValue() { return value; } } } 输出结果是: absoluteZero is : -459 freezing is : 32 boiling is : 212 paperBurns is : 451 尽管enums有这么多的属性,但并不是用的越多越好,如果那样还不如直接用类来的直接.enums的优势在定义int最终变量仅当这些值有一定特殊含义时.但是如果你需要的是一个类,就定义一个类,而不是enum.

来源: [http://xiewenbo.iteye.com/blog/1313676](http://xiewenbo.iteye.com/blog/1313676)

Java空格转码

Posted on

Java空格转码

字符串中的空格转义 String a = "hello world baby"; 请问如何将空格转义成转义字符,结果是a = "hello\u0000world\u0000baby" ------解决方案-------------------- Java code

a = a.replaceAll("\s","\u0000") ------解决方案-------------------- 探讨 Java code a = a.replaceAll("\s","\u0000") ------解决方案-------------------- 话说java正则中,用\\代表\ ------解决方案-------------------- a = a.replaceAll("\s","\u0000") 来源: [http://www.myexception.cn/java-web/45129.html](http://www.myexception.cn/java-web/45129.html)

java字符串的各种编码转换

Posted on

java字符串的各种编码转换

Java世界

学习笔记

导航

留言簿(6)

随笔档案

文章档案

阅读排行榜

评论排行榜

统计

  • 随笔 - 71
  • 文章 - 9
  • 评论 - 48
  • 引用 - 0

积分与排名

  • 积分 - 64465
  • 排名 - 229

天籁村

新华网

雅虎

最新评论

java字符串的各种编码转换

import java.io.UnsupportedEncodingException;

/// / 转换字符串的编码 // public class ChangeCharset { /// 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 // public static final String US_ASCII = "US-ASCII"; /// ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 // public static final String ISO_8859_1 = "ISO-8859-1"; /// 8 位 UCS 转换格式 // public static final String UTF_8 = "UTF-8"; /// 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 // public static final String UTF_16BE = "UTF-16BE"; /// 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 // public static final String UTF_16LE = "UTF-16LE"; /// 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 // public static final String UTF_16 = "UTF-16"; /// 中文超大字符集 /*/ public static final String GBK = "GBK";

/// / 将字符编码转换成US-ASCII码 // public String toASCII(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, US_ASCII); } /// / 将字符编码转换成ISO-8859-1码 // public String toISO_8859_1(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, ISO_8859_1); } /// / 将字符编码转换成UTF-8码 // public String toUTF_8(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, UTF_8); } /// / 将字符编码转换成UTF-16BE码 // public String toUTF_16BE(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, UTF_16BE); } /// / 将字符编码转换成UTF-16LE码 // public String toUTF_16LE(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, UTF_16LE); } /// / 将字符编码转换成UTF-16码 // public String toUTF_16(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, UTF_16); } /// / 将字符编码转换成GBK码 // public String toGBK(String str) throws UnsupportedEncodingException{ return this.changeCharset(str, GBK); }

/// / 字符串编码转换的实现方法 / @param str 待转换编码的字符串 / @param newCharset 目标编码 / @return / @throws UnsupportedEncodingException // public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException { if (str != null) { //用默认字符编码解码字符串。 byte[] bs = str.getBytes(); //用新的字符编码生成字符串 return new String(bs, newCharset); } return null; } /// / 字符串编码转换的实现方法 / @param str 待转换编码的字符串 / @param oldCharset 原编码 / @param newCharset 目标编码 / @return / @throws UnsupportedEncodingException /*/ public String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException { if (str != null) { //用旧的字符编码解码字符串。解码可能会出现异常。 byte[] bs = str.getBytes(oldCharset); //用新的字符编码生成字符串 return new String(bs, newCharset); } return null; }

public static void main(String[] args) throws UnsupportedEncodingException { ChangeCharset test = new ChangeCharset(); String str = "This is a 中文的 String!"; System.out.println("str: " + str); String gbk = test.toGBK(str); System.out.println("转换成GBK码: " + gbk); System.out.println(); String ascii = test.toASCII(str); System.out.println("转换成US-ASCII码: " + ascii); gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK); System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk); System.out.println(); String iso88591 = test.toISO_8859_1(str); System.out.println("转换成ISO-8859-1码: " + iso88591); gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK); System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk); System.out.println(); String utf8 = test.toUTF_8(str); System.out.println("转换成UTF-8码: " + utf8); gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK); System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk); System.out.println(); String utf16be = test.toUTF_16BE(str); System.out.println("转换成UTF-16BE码:" + utf16be); gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK); System.out.println("再把UTF-16BE码的字符串转换成GBK码: " + gbk); System.out.println(); String utf16le = test.toUTF_16LE(str); System.out.println("转换成UTF-16LE码:" + utf16le); gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK); System.out.println("再把UTF-16LE码的字符串转换成GBK码: " + gbk); System.out.println(); String utf16 = test.toUTF_16(str); System.out.println("转换成UTF-16码:" + utf16); gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK); System.out.println("再把UTF-16码的字符串转换成GBK码: " + gbk); String s = new String("中文".getBytes("UTF-8"),"UTF-8"); System.out.println(s); }

}

    java中的String类是按照unicode进行编码的,当使用String(byte[] bytes, String encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的String是什么编码方式,换句话说,是让系统把bytes中的数据由encoding编码方式转换成unicode编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。

    当我们从文件中读数据时,最好使用InputStream方式,然后采用String(byte[] bytes, String encoding)指明文件的编码方式。不要使用Reader方式,因为Reader方式会自动根据jdk指明的编码方式把文件内容转换成unicode编码。

    当我们从数据库中读文本数据时,采用ResultSet.getBytes()方法取得字节数组,同样采用带编码方式的字符串构造方法即可。

ResultSet rs; bytep[] bytes = rs.getBytes(); String str = new String(bytes, "gb2312");

不要采取下面的步骤。

ResultSet rs; String str = rs.getString(); str = new String(str.getBytes("iso8859-1"), "gb2312");

    这种编码转换方式效率底。之所以这么做的原因是,ResultSet在getString()方法执行时,默认数据库里的数据编码方式为iso8859-1。系统会把数据依照iso8859-1的编码方式转换成unicode。使用str.getBytes("iso8859-1")把数据还原,然后利用new String(bytes, "gb2312")把数据从gb2312转换成unicode,中间多了好多步骤。

    从HttpRequest中读参数时,利用reqeust.setCharacterEncoding()方法设置编码方式,读出的内容就是正确的了。

posted on 2008-03-27 15:03 Rabbit 阅读(14630) 评论(13) 编辑 收藏

[

评论

]()

感谢分享 回复 更多评论

谢谢支持! 回复 更多评论

顶~ 回复 更多评论

inputstreamReader 可以直接指定编码的…… 回复 更多评论

相当的有用啊,感谢分享 回复 更多评论

有些编码不能直接转换的吧! 回复 更多评论

具体情况具体分析,不一定全部适用。 回复 更多评论

"当使用String(byte[] bytes, String encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的String是什么编码方" 完全错误,不要误导读者. 回复 更多评论

@Greale 请加以测试给出结论,请查看String str = new String(bytes, "gb2312");这个字符类的原代码即可得出答案。 回复 更多评论

简直是不负责任呀......全是错的.......敢不敢看文档再发 回复 更多评论

@Greale 我来说句,下面这个来自jdk的文档, String(byte[] bytes, String charsetName) 构造一个新的 String,方法是使用指定的字符集解码指定的字节数组 rabbit是对的。 回复 更多评论

谢谢 回复 更多评论

谢了 回复 更多评论 新用户注册 刷新评论列表

淘宝网诚聘资深J2ME开发工程师 IT新闻: · Novell推新虚拟设备 简化向Windows 7迁移 · 原淘宝商城负责人黄若加盟当当网任COO · 微软的“三屏一云”计划导致SQL CE数据库消失? · 苹果招聘LTE技术经理 或推4G版iPhone · 金山将砸2亿开发网游 今年推新款作品 专题:Android iPad jQuery Chrome OS 博客园首页 IT新闻 知识库 学英语 Java程序员招聘 标题 请输入标题 姓名 请输入你的姓名 主页 请输入验证码 验证码 /* 内容(请不要发表任何与政治相关的内容) 请输入评论内容 Remember Me? 登录 [使用Ctrl+Enter键可以直接提交] 每天10分钟,轻松学英语 推荐职位: · 飞信服务器端高级.NET开发工程师(新媒传信) · .NET飞信官网开发工程师(新媒传信) · .NET技术开发总监(广州衣酷) · Web前端研发工程师(百度) · .NET初级程序员 (北京安人) · .NET中级程序员 (北京安人) · C++开发工程师(沪江网) · 前端开发工程师(沪江网)

博客园首页随笔: · 界面开发(五)--- 界面优化 · 项目“结项期”中如何改善开发VS测试效率的一点想法 · 团队基础生成自动化流程之最佳实践总论(III) – 重写生成号产生机制 · Phase Change Memory初步 · 发布一款基于C/#的机器视觉库 知识库: · 如何明智选择数据库平台 · 我们的原型设计方法 · 写商业计划书——团队里该有谁?by Angels Den · google vs.yahoo:谁的社会化媒体策略更胜一筹? · 淘心得——浅谈淘宝网的社会化之路 网站导航:

博客园 IT新闻 个人主页 博客生活 IT博客网 C++博客 博客园社区 管理

Powered by: BlogJava Copyright © Rabbit

eclipse生成javadoc时出错:编码GBK的不可映射字符

Posted on

eclipse生成javadoc时出错:编码GBK的不可映射字符

首页 新闻 论坛 问答 博客 招聘 更多 ▼

专栏 文摘 圈子 搜索

您还未登录 ! 我的应用 登录 注册

子夜轻风

永久域名 http://huibin.javaeye.com/

java中的注释规范 | 异常备忘:java.lang.UnsupportedClassVers ...

2009-08-31

eclipse生成javadoc时出错:编码GBK的不可映射字符

由于java源代码是用的UTF-8编码,Eclipse中默认编码是GB18030,因此,在生成javadoc的时候,需要手工指定一下编码和字符集。 主菜单–>Project–>Generate javadoc–>next–>next–> 在 “Extra javadoc options”下面的文本框中填入 ” -encoding UTF-8 -charset UTF-8 “.

1 楼 zyhui98 2009-12-17 引用

太好了,今天就遇到了这个问题。lz很厉害!不过 有下面的问题 正在构造 Javadoc 信息... E:\JAVA\Gwap-struts2\src\cn\com\tarena\ecport\listener\HibernateListener.java:3: 软件包 javax.servlet 不存在 import javax.servlet.ServletContextEvent;

发表评论

您还没有登录,请登录后发表评论(快捷键 Alt+S / Ctrl+Enter)

huibin的博客

huibin

搜索本博客

最近访客 >>更多访客

Asdpboy的博客

Asdpboy

tmgs2001的博客

tmgs2001 yufu863的博客

yufu863

john_chen的博客

john_chen

博客分类

QQ截图未命名_conew1.png 共 1 张

其他分类

存档

评论排行榜

【Java 基础专题】编码与乱码(02)

Posted on

【Java 基础专题】编码与乱码(02)---String的getBytes([encoding])方法测试

[登录] [注册]|

程序人生

【Java 基础专题】编码与乱码(02)---String的getBytes([encoding])方法测试

[ 251 浏览 ][手机版]

返回列表 发布日期: 2010-02-22 23:50 发布者: cobra 1/#

字体大小: t T

上一篇:【Java 基础专题】编码与乱码(01)---编码基础

  1. package example.encoding; 1.
  2. import java.io.UnsupportedEncodingException; 1.
  3. /// /////*
  4. /* The Class GetBytesTest.
  5. /*/
  6. public class GetBytesTest { 1.
  7. /// /////*
  8. /* The main method.
  9. /*
  10. /* @param args the arguments
  11. /*/
  12. public static void main(String args[]) {
  13. String content = "中文";
  14. String defaultEncoding = System.getProperty("file.encoding");
  15. String defaultLnaguage = System.getProperty("user.language");
  16. System.out.println("System default encoding --- " + defaultEncoding);
  17. System.out.println("System default language --- " + defaultLnaguage); 1.
  18. GetBytesTest tester = new GetBytesTest(); 1.
  19. byte[] defaultBytes = tester.getBytesWithDefaultEncoding(content);
  20. tester.printBytes(defaultBytes); 1.
  21. byte[] iso8859Bytes = tester.getBytesWithGivenEncoding(content,
  22. "ISO-8859-1");
  23. tester.printBytes(iso8859Bytes); 1.
  24. byte[] gbkBytes = tester.getBytesWithGivenEncoding(content, "GBK");
  25. tester.printBytes(gbkBytes); 1.
  26. byte[] utfBytes = tester.getBytesWithGivenEncoding(content, "UTF-8");
  27. tester.printBytes(utfBytes); 1.
  28. } 1.
  29. /// /////*
  30. /* Gets the bytes with default encoding.
  31. /*
  32. /* @param content the content
  33. /*
  34. /* @return the bytes with default encoding
  35. /*/
  36. public byte[] getBytesWithDefaultEncoding(String content) {
  37. System.out.println("\nEncode with default encoding\n");
  38. byte[] bytes = content.getBytes();
  39. return bytes;
  40. } 1.
  41. /// /////*
  42. /* Gets the bytes with given encoding.
  43. /*
  44. /* @param content the content
  45. /* @param encoding the encoding
  46. /*
  47. /* @return the bytes with given encoding
  48. /*/
  49. public byte[] getBytesWithGivenEncoding(String content, String encoding) {
  50. System.out.println("\nEncode with given encoding : " + encoding + "\n");
  51. try {
  52. byte[] bytes = content.getBytes(encoding);
  53. return bytes;
  54. } catch (UnsupportedEncodingException e) {
  55. e.printStackTrace();
  56. return null;
  57. }
  58. } 1.
  59. /// /////*
  60. /* Prints the bytes.
  61. /*
  62. /* @param bytes the bytes
  63. /*/
  64. public void printBytes(byte[] bytes) {
  65. for (int i = 0; i < bytes.length; i++) {
  66. System.out.print(" byte[" + i + "] = " + bytes);
  67. System.out
  68. .println(" hex string = " + Integer.toHexString(bytes));
  69. }
  70. } 1.
  71. } 复制代码 【1】在中文平台下,测试结果如下: System default encoding --- GBK System default language --- zh Encode with default encoding byte[0] = -42 hex string = ffffffd6 byte[1] = -48 hex string = ffffffd0 byte[2] = -50 hex string = ffffffce byte[3] = -60 hex string = ffffffc4 Encode with given encoding : ISO-8859-1 byte[0] = 63 hex string = 3f byte[1] = 63 hex string = 3f Encode with given encoding : GBK byte[0] = -42 hex string = ffffffd6 byte[1] = -48 hex string = ffffffd0 byte[2] = -50 hex string = ffffffce byte[3] = -60 hex string = ffffffc4 Encode with given encoding : UTF-8 byte[0] = -28 hex string = ffffffe4 byte[1] = -72 hex string = ffffffb8 byte[2] = -83 hex string = ffffffad byte[3] = -26 hex string = ffffffe6 byte[4] = -106 hex string = ffffff96 byte[5] = -121 hex string = ffffff87 【2】在英文平台下,测试结果如下: System default encoding --- Cp1252 System default language --- en Encode with default encoding byte[0] = 63 hex string = 3f byte[1] = 63 hex string = 3f Encode with given encoding : ISO-8859-1 byte[0] = 63 hex string = 3f byte[1] = 63 hex string = 3f Encode with given encoding : GBK byte[0] = -42 hex string = ffffffd6 byte[1] = -48 hex string = ffffffd0 byte[2] = -50 hex string = ffffffce byte[3] = -60 hex string = ffffffc4 Encode with given encoding : UTF-8 byte[0] = -28 hex string = ffffffe4 byte[1] = -72 hex string = ffffffb8 byte[2] = -83 hex string = ffffffad byte[3] = -26 hex string = ffffffe6 byte[4] = -106 hex string = ffffff96 byte[5] = -121 hex string = ffffff87 【结论】 getBytes()、getBytes(encoding)函数的作用是使用系统默认或者指定的字符集编码方式,将字符串编码成字节数组。 在中文平台下,默认的字符集编码是GBK,此时如果使用getBytes()或者getBytes("GBK"),则按照GBK的编码规则将每个中文字符用2个byte表示。所以我们看到"中文"最终GBK编码结果就是: -42 -48 -50 -60 。-42和-48代表了"中"字,而"-50"和"-60"则代表了"文"字。 在中文平台下,如果指定的字符集编码是UTF-8,那么按照UTF-8对中文的编码规则:每个中文用3个字节表示,那么"中文"这两个字符最终被编码成:-28 -72 -83、-26 -106 -121两组。每3个字节代表一个中文字符。 在中文平台下,如果指定的字符集编码是ISO-8859-1,由于此字符集是单字节编码,所以使用getBytes("ISO-8859-1") 时,每个字符只取一个字节,每个汉字只取到了一半的字符。另外一半的字节丢失了。由于这一半的字符在字符集中找不到对应的字符,所以默认使用编码63代替,也就是?。 在英文平台下,默认的字符集编码是Cp1252(类似于ISO-8859-1),如果使用GBK、UTF-8进行编码,得到的字节数组依然是正确的 (GBK4个字节,UTF-8是6个字节)。因为在JVM内部是以Unicode存储字符串的,使用getBytes(encoding)会让JVM进行一次Unicode到指定编码之间的转换。对于GBK,JVM依然会转换成4个字节,对于UTF-8,JVM依然会转换成6个字节。但是对于ISO- 8859-1,则由于无法转换(2个字节--->1个字节,截取了一半的字节),所以转换后的结果是错误的。 相同的平台下,同一个中文字符,在不同的编码方式下,得到的是完全不同的字节数组。这些字节数组有可能是正确的(只要该字符集支持中文),也可能是完全错误的(该字符集不支持中文)。 记住: 不要轻易地使用或滥用String类的getBytes(encoding)方法,更要尽量避免使用getBytes()方法。因为这个方法是平台依赖的,在平台不可预知的情况下完全可能得到不同的结果。如果一定要进行字节编码,则用户要确保encoding的方法就是当初字符串输入时的 encoding。(文/Paul Lin) 下一篇:【Java 基础专题】编码与乱码(03)----String的toCharArray()方法测试

赞助商广告: 下面是更多相关的免费资源

《Google Android开发入门与实战》源码下载修订后的电子书Java Persistence with Hibernate(英文版)下载《OSGi原理与最佳实践》精选版下载Google Android应用框架原理与程式设计36技Java NIO 入门学习(读写文件)Java NIO 入门学习(通道和缓冲区)Java NIO 入门学习(过门)精简的JAVA计算器代码Groovy 深入探索——Metaclass的存放Java NIO 应用 -- 使用内存映射文件实现进程间通信共享内存在Java中实现和应用Spring 2.5 中文简明教程下载Java制作的快速打开文件夹、程序的小工具《Programming in Lua》中文版PDFKiller Game Programming in JavaJ2ME XHTML浏览器、J2ME WML浏览器、J2ME WAP浏览器(0.50b版)使用Ant实现zip压缩解压功能免费论坛程序JForum的安装说明JavaBean一键生成插件:JavaBeanAssistantThe Definitive Guide to Jython: Python for the Java Platform **TOP

返回列表 赞助商广告:

拼吾爱程序人生 - 统计 - Sitemap 鄂ICP备07500843号

CopyRight © 2007-2010 Pin5i-Programming-Life 本站法律顾问:ITLAW-庄毅雄律师

Powered by Discuz!NT 3.0.0 Processed in 0.09375 second(s) , 6 queries.