璐莹's profileTina小路路PhotosBlogLists Tools Help

Blog


    August 31

    JAVA的国际化机制

         国际化(Internationalization)是设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。国际化有时候被简称为i18n,因为有18个字母在国际化的英文单词的字母i和n之间。

      一个国际化的程序通常具有以下特征:

      有一个附加的本地化数据(localized data)及拥有在全世界各个地区执行的能力。
      文本的元素,比如状态信息或GUI截面的lables,不是直接写(hardcoded)在程序中,而是被存储在本地化的数据中,并且能被程序正确的动态的使用。
      支持新的语言时,不需要修改程序,不需要重新编译。
      文化差异的数据,比如日期和货币,必须根据拥护的语言和习惯显示不同的格式。
      可以被迅速的本地化。
      本地化(Localization)是指通过增加本地描述的构件(locale-specific components )和文字翻译工作来使应用程序适应于不同的语言和地区的过程。本地化有时候被简称为l10n,应为有10个字母在本地化的英文单词的字母l和n之间。通常本地化最耗时的工作应该是文字翻译。本地化工作者们要根据地区的具体需求来为日期、数字和通货等数据建立新的格式。其他类型的数据,象声音,图象等,也需要根据具体需要来决定是否本地化。

      下面通过一个简单的例子来说明如何给一个程序提供国际化的特性。这个例子在不同的语言环境下显示不同的文本信息。

      一个简单的例子
      先看下面的一段代码:
      public class NotI18N {
      static public void main(String[] args) {
      System.out.println("Hello.");
      System.out.println("How are you?");
      System.out.println("Goodbye.");
      }
      }
      如果你决定在上面的程序中给德国和法国的不同用户显示同样的信息。但是你的程序员却不是个语言专家,他不懂德语和法语。所以你需要翻译人员把它翻译成德语和法语,但是你的翻译人员不懂程序,所以你可以把这些信息存到一个文本或其他格式的文件中供翻译人员使用。那么,程序必须能显示不同语言的信息,并且你并不知道你希望为这个程序提供的下一个语言支持是什么,或许是日语或许是别的什么语言。
      下面的代码是一个国际化的代码的例子:
      import java.util.*;

      public class I18NSample {
      static public void main(String[] args) {
      String language;
      String country;

      if (args.length != 2) {
      language = new String("en");
      country = new String("US");
      } else {
      language = new String(args[0]);
      country = new String(args[1]);
      }

      Locale currentLocale;
      ResourceBundle messages;

      currentLocale = new Locale(language, country);
      messages = ResourceBundle.getBundle("MessagesBundle",
      currentLocale);
      System.out.println(messages.getString("greetings"));
      System.out.println(messages.getString("inquiry"));
      System.out.println(messages.getString("farewell"));
      }
      }
      请注意:在上面的代码中,信息并没有被hardcoded在代码中!
      如果想运行上面的代码,请下载下面的文件:
      1、I18NSample.java
      2、MessageBundle.properties
      3、MessageBundle_de_DE.properties
      4、MessageBundle_en_US.properties
      5、MessageBundle_fr_FR.properties
      下面看看这个程序的运行结果:
      显示法语信息:
      java I18NSample fr FR
      Bonjour.
      Comment allez-vous?
      Au revoir.
      显示英语信息:
      java I18NSample en US
      Hello.
      How are you?
      Goodbye.

      从上面的代码我们可以看出,在实现了国际化的代码中,并没有将需要显示的信息直接hardcode在代码中,而是存在一个文件中供程序使用。程序根据不同的语言和国家(Local)来取得文件中不同信息显示。我们试着按一下的步骤一步一步分析这段代码如何实现了国际化:



      1、建立properties文件----本地化数据
      properties文件用来存储程序和环境相关的信息。必须以.properties的后缀结尾,properties文件是纯文本格式的。在上面的例子中,一共有4个properties文件。分别定义了不同语言和国家的打招呼、再见和问候时使用的语言。properties文件使用名值对(key-value)的形式,如下所示:
      greetings = Bonjour.
      farewell = Au revoir.
      inquiry = Comment allez-vous?
      properties文件的名字很重要,它的形式是basename_LL_CC.properties.LL表示语言代码,CC表示国家代码。语言代码和国家代码是Local类初始化的参数,basename是创建ResourceBundle对象的参数。

      2、创建Local对象----不同语言和国家的标识
      java.util.Local是JDK提供的标准API。这个类用来标识国家和语言。
      我们可以创建一个local对象:
      aLocale = new Locale("en","US");
      这个对象标志了一个地方,这个地方是美国,并且这里的语言是英语。
      这下面2个对象又表示什么呢?
      caLocale = new Locale("fr","CA");
      frLocale = new Locale("fr","FR");
      caLocale对象标志的是加拿大并且那里使用了法语,而frLocal标志的是法国而那里的语言是法语。
      注意:Local对象只是一个标识类,创建了这个类的对象并不表示你的程序已经实现了国际化。这个类是给那些需要实现国际化的类使用的,它用来标识我们即将实现国际化的Local信息。

      3、创建ResourceBundle对象----本例中实现国际化的主要角色

      java.util.ResourceBundle是JDK提供的标准API。它实际上是个抽象类,同时它提供了创建它的子类的静态工厂方法。在例子程序中我们实际上使用的是ResourceBundle的子类PropertyResourceBundle的对象。通过它,我们可以根据Local对象来读取不同的properties文件,从而取得不同的信息。
      如果local = new Locale("en","US");则读取了MessagesBundle_en_US.properties文件。
      在例子中,用如下语句创建这个对象:
      message = ResourceBundle.getBundle("MessagesBundle", currentLocale);

      4、用ResourceBundle读取信息----本地化实现了
      读取了propeties文件后,我们就可以用ResourceBundle的实例通过getString(String Key)方法来取得信息了。如下的语句所示:
      String msg1 = messages.getString("greetings");
    August 29

    如何在Eclipse 3.1.1上安装jadclipse[java的反编译工具]

          早上闲来无聊,在网上找了个好东东,跟大家分享一下.
         

    jad是java的反编译工具,是命令行执行,反编译出来的源文件可读性较高。可惜用起来不太方便。还好

    找到eclipse下的插件,叫jadclipse,安装好之后,只要双击.class文件,就能直接看源文件,包括jar

    包中的class文件,也可以直接反编译。

    1.下载jad1.5.8e
    http://www.kpdus.com/jad.html#download
    下载后解压。解压缩后将jad.exe拷贝到JRE的bin目录下,如\Java\jre1.5.0_06\bin

    2.下载 jadclipse_3.1.0.jar
    http://jaist.dl.sourceforge.net/sourceforge/jadclipse/jadclipse_3.1.0.jar
    将jadclipse_3.1.0.jar复制到D:\Program Files\eclipse\myplugin\eclipse\plugins目录下(用的是

    link方式安装插件的)。

    3.启动Eclipse后,在Windows-->Perference-->Java下面应该会多出一个JadClipse目录,相关的设置可

    以在此修改
    配置jadclipse:设置path to decompiler为jad.exe的全路径,如:F:\Java\jre1.5.0_06\bin\jad.exe

    ,在Directory for temporary files中指定临时文件的路径,如:G:\Java\eclipse-SDK-3.0-win32\temp
    4、在Eclipse的Windows-->Perference-->General->Editors->File Associations中修改“*.class”默

    认关联的编辑器为“JadClipse Class File Viewer”
    5、安装完成,双击class文件,Eclipse将自动反编译了。

    ps:http://www.bczs.net/xml/2005/9/8/4257873.xml一个讲jar挺不错的网址.

    August 25

    MD5加密

    MD5加密算法简单介绍

      在现阶段,我们一般认为存在两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。

      单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。可能我们立即就会想,这样的加密有什么用处?不能解密的加密算法有什么作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

      MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

      MD5CyptoServiceProvider类是.NET中System.Security.Cryptography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中我们用来加密数据库中密码的类。在真正进行数据加密之前,我们首先来了解MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。现在,我们就来看一个具体的实例:

    '要加密的明文字符串

    Dim strPlainText as String = "Encrypt me!"


    '用于存放明文字符串的数组

    Dim hashedDataBytes as Byte()


    Dim encoder as New UTF8Encoding()


    '建立MD5CryptoService实例

    Dim md5Hasher as New MD5CryptoServiceProvider()


    '加密运算

    hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))


      看完以上的具体实例以后,我们知道,ComputeHash方法只能接受数组作为加密对象,输出的密文也是数组,因此,在对字符串加密之前,我们必须首先将这些字符串转化为数组,这就要用到UTF8Encoding类的GetBytes方法,将字符串转化为数组,而加密以后的结果也是使用数组输出。

    使用加密方式保存密码到数据库的限制

      在决定是否使用加密方式保存密码以前,我们还需要考虑一些问题。因为MD5是单次加密算法,加密以后的信息不可以解密,所以,如果用户丢失密码,任何人都很难找到用户原来的密码,这时候,网站也就相应的失去一个很重要的功能,那就是用户提供其他信息来取得忘记的密码的功能,这不能不说是网站的一个大缺陷。另外,采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册,这也是这种方法比较困难的一个地方。

    August 10

    随笔

          转眼又到周末了,时间过得真快,这周去江心洲摘葡萄,还是第一次去摘呢,有点兴奋.
          熊熊和老三都是这周过生日,本想去看他们的,可熊熊不让,不去也好,距离产生美,让他们多思恋我一点吧.相信他们会喜欢我的礼物的,那些图片可是我花了一个下午偷偷跑到公司打印的.也想下次见到三儿的时候她能有点小变化.
          这周事没干什么会倒是没少开,我对项目也没什么了解,所以每次抢个后面的位子坐着.看着组员们为了一些技术问题争吵不息,倒觉得像自己这样当个事外的人也挺好.听不懂就不听,船到桥头自然直,等让我干事的时候会跟我讲的.
          我们组的其他人到现在还在加班呢,为了让他们心里不平衡我也加班,不过事加班玩,也算给同志们一点支持吧.
         
    August 04

    明天考语文

         明天参加一场特殊的考试,考试内容是语文和英语,今晚临时抱佛脚,看了看模拟题.英语就看了开始的十道,错了一题,感觉还不错,就没再往下看,对自己英语还是有信心的.这种考试对我而言,小case.
         倒是语文考试有点怕,最近一次就是高考,而且是很多年以前的事情.题目中涉及的知识点在高中都学过,虽是选择题,基本不会.
        

    11.“祸起萧墙”这个成语出自      

    A.〈〈道德经〉〉     B.〈〈庄子〉〉    C.〈〈论语〉〉   D.〈〈孟子〉〉

    12.《史记》是我国第一部          

        A.断代史   B.纪传体通史    C.编年史    D.国别史

    13.《茶馆》是现代著名剧作家        的作品。

        A.曹禺    B.郭沫若    C.老舍    D.夏衍   

    14.《再别康桥》是著名诗人          的代表作。

        A.海子    B.舒婷    C.徐志摩   D.顾城 

    15 “安能摧眉折腰事权贵,使我不得开心颜”是     的诗句。

    A.屈原    B.陶渊明    C.李白    D.杜甫   

     

    突然觉得自己有点文盲,中文水平也就小学毕业吧.god bless me明天考试及格.