Java 国际化和字符集

  • 一、国际化
    • 1、Java中的国际化
    • 2、Spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类。
      • Spring 中国际化操作与Java原生提供的工具相比
      • 容器级的国际化信息资源
  • 二、字符集

一、国际化

1、Java中的国际化

参考文章1
参考文章2
参考文章3

国际化 ,英文叫 internationalization 单词太长 ,又被简称为 i18n(去头去尾中间有18个字母)。Java 中实现国际化主要是借助一个工具类 ResourceBundle ,核心的思想就是 ,对不同的语言环境提供一个不同的资源文件 。资源文件通常采用键值对的形式 ,并且资源文件中采用的是 properties 格式文件 ,所以文件中的所有字符都必须是 ascll 码 ,不能保存为中文的 ,Java 中提供 了 native2ascll 工具用于将中文转化为 ascll 码 。所以在编写 properties 文件的时候写的是中文 ,一回车就自动被编码了 。不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的----Unicode编码表示。JDK在bin目录下提供了一个完成此项功能的native2ascii工具,它可以将中文字符的资源文件转换为Unicode代码格式的文件,命令格式如下:
native2ascii [-reverse] [-encoding 编码] [输入文件 [输出文件]]

对于MyEclipse来说,使用MyEclipse Properties Editor编辑资源属性文件;对于Intellij IDEA来说,无须安装任何插件就自然支持资源属性文件的这种编辑方式了。

国际化资源文件的命名规范规定资源名称采用以下的方式进行命名:
<资源名>_<语言代码> _<国家/地区代码>.properties

java.util.Locale是表示语言和国家/地区信息的本地化类,它是创建国际化应用的基础。
下面给出几个创建本地化对象的示例:

//1、带有语言和国家/地区信息的本地化对象
Locale locale1 = new Locale("zh","CN");   //2、只有语言信息的本地化对象
Locale locale2 = new Locale("zh");   //3、等同于Locale("zh","CN")
Locale locale3 = Locale.CHINA;   //4、等同于Locale("zh")
Locale locale4 = Locale.CHINESE;   //5、获取本地系统默认的本地化对象
Locale locale5= Locale.getDefault();

用户既可以同时指定语言和国家/地区参数定义一个本地化对象locale1 ,也可以仅通过语言参数定义一个泛本地化对象locale2。Locale类中通过静态常量定义了一些常用的本地化对象,locale3和locale4处就直接通过引用常量返回本地化对象。此外,用户还可以获取系统默认的本地化对象,如上locale5。

  • 固定文本的国际化(固定文本包括菜单名 ,导航条 ,系统提示信息等)
    在 Java API 中提供了一个 ResourceBundle 类用于描述一个资源包 ,并且 ResourceBundle 类提供了相应的静态方法 getBundle ,这个方法可以根据来访者的国家地区自动绑定对应的资源文件 。

相对于类路径的目录中加载一个名为resource的本地化资源文件:

ResourceBundle rb = ResourceBundle.getBundle("com/baobaotao/i18n/resource", locale)

通过以下的代码即可访问资源文件的属性值:

rb.getString("greeting.common")

ResourceBundle在加载资源时,如果指定的本地化资源文件不存在,它按以下顺序尝试加载其他的资源:本地系统默认本地化对象对应的资源→默认的资源。

  • 动态文本的国际化(数值 ,货币 ,时间 ,日期等由于可能在程序运行时动态产生 )
国际化对象 工具类 说明
日期 DateFormat
动态文本 MessageFormat 允许开发人员用占位符替换掉字符串中的敏感数据( 即国际化相关的数据 )字符串中的 {0} {1} {2} {3} 就是占位符 。
数值 NumberFormat 将一个数值格式化为符合某个国家地区习惯的数值字符串 ,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值 。

2、Spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类。

方法 说明
String getMessage(String code, Object[] args, String defaultMessage, Locale locale) code表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;locale表示本地化对象;
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException 与上面的方法类似,只不过在找不到资源中对应的属性名时,直接抛出NoSuchMessageException异常;
String getMessage( MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException MessageSourceResolvable 将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。

HierarchicalMessageSource接口最重要的两个实现类是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。它们基于Java的ResourceBundle基础类实现,允许仅通过资源名加载国际化资源。

  1. ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。
  2. StaticMessageSource主要用于程序测试,它允许通过编程的方式提供国际化信息。而DelegatingMessageSource是为方便操作父MessageSource而提供的代理类。

Spring 中国际化操作与Java原生提供的工具相比

最主要的区别在于无须再分别加载不同语言、不同国家/地区的本地化资源文件,仅仅通过资源名就可以加载整套的国际化资源文件(使用了配置文件)。此外,无须显式使用MessageFormat操作国际化信息,仅通过MessageSource# getMessage()方法就可以完成操作了。

容器级的国际化信息资源

一般情况下不会直接通过引用MessageSource Bean使用国际信息,直接通过ApplicationContext访问国际化信息。

二、字符集

参考文章
不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的----Unicode编码表示。

Java 国际化和字符集相关推荐

  1. java国际化——消息格式化+文本文件和字符集

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--消息格式化+文本文件和字符集 的基础知识 : 2) 由于本文 ...

  2. java jdk设置字符集_使用JDK 11在Java字符串上的新方法

    java jdk设置字符集 Java的String类似乎将在JDK 11中获得一些新方法,该方法将于2018年9月发布. 错误号 错误标题 新的String方法 描述 JDK-8200425 字符串: ...

  3. java 国际化_Java国际化基础

    关于本教程 本教程是关于什么的? 本教程向您介绍Java编程语言对多语言和多国家/地区环境的支持. 本课程首先对国际化原则和概念进行一般性讨论,然后继续对Java国际化支持的特定领域进行概述. 最后几 ...

  4. JAVA国际化教程【转载】

    JAVA国际化教程1.关于本教程 2.简介 3.Java平台I18N支持概述 4.Unicode与Java字符 5.提供本地化的资源 6.使用日期.数字和货币 7.将各部分放到一起 8.结束语与参考资 ...

  5. java国际化——资源包

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 旨在理解 java国际化--资源包 的基础知识 : 2) 本文源代码idea 转自: (利用propertie ...

  6. java国际化——日期和时间+排序

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--日期和时间+排序 的基础知识 : [1]日期和时间 1)当格 ...

  7. java国际化——Locale+数字格式

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--Locale+数字格式 的基础知识 : 2) java 编程 ...

  8. Java国际化概念和使用介绍

    国际化是商业软件系统的一个基本要求,因为当今的软件系统需要面对全球的浏览者.国际化的目的就是根据用户的语言环境的不同向用户输出与之相应的页面,以示友好. 程序国际化已成为 Web 应用的基本要求.随着 ...

  9. java国际化 英语的标识符_(转)Java 国际化

    1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...

最新文章

  1. struts2漏洞监测_Apache Shiro身份验证绕过漏洞风险提示
  2. 6G网络智能内生的思考
  3. C++中的值传递、指针传递、引用传递
  4. Python 中的 lstrip、rstrip、strip
  5. Visual Studio 2008 每日提示(二十三)
  6. Delphi 中Tform的visible属性详解
  7. 谨慎注意WebBrowser控件的DocumentCompleted事件
  8. UDP对应的应用层协议之DNS、DHCP
  9. 组合的输出(洛谷P1157题题解,Java语言描述)
  10. 成都文理学院计算机一级还没考过,两次查成绩不一致,合格成不合格?成都文理学院官方回应...
  11. 128.最长连续序列(力扣leetcode) 博主可答疑该问题
  12. 自动化遍历-appcrawler
  13. 中国科学院大学计算机在职博士招生,中国科学院在职博士研究生如何报考?
  14. c语言编程车辆信息管理,车辆信息管理.cpp
  15. 解读制造业数字化转型的六大因素
  16. 组网胖模式_华三无线apEWP-WA4320i-acn-fit 如何由瘦模式改为胖模式
  17. Intel无线网卡linux,Gentoo 安装之intel无线网卡篇
  18. Unity中TextMeshPro显示中文
  19. uva 10285 - Longest Run on a Snowboard(dp+记忆化搜索)
  20. 火车头采集器在线发布模块制作教程

热门文章

  1. 微信小程序-中英文切换
  2. 转载和积累系列 - 基于JavaScript的DDoS攻击
  3. 移动安全加固助力 App 实现全面、有效的安全防护
  4. idea集成docker插件
  5. [附源码]Python计算机毕业设计Django+Vue的健身房会员系统的设计与实现
  6. CCF计算机软件能力认证试题练习:201809-2 买菜
  7. SD卡?TF卡?傻傻分不清楚?
  8. D3地图上如何标注坐标点
  9. 2022-5-11作业
  10. spring cloud微服务分布式云架构 - common-service 项目构建过程