【0】README

1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化——消息格式化+文本文件和字符集 的基础知识 ;
2) 由于本文涉及到的源代码都比较简单,所以直接将全部代码po到了本文对应位置,没有提供下载link;


【1】消息格式化

1)java类库中有一个 MessageFormat 类, 用来格式化带变量的文本, 如:

“on {2}, a {0} destroyed {1} houses and caused {3} of damage”;

  • 1.1)括号中的数字是一个占位符, 可以用实际的名字和值来替换它。
  • 1.2)使用静态方法 MessageFormat.format 可以用实际的值来替换这些占位符。从JDK5 开始, 它已经是一个 varargs 方法了,所以你可以通过下面的方法提供参数: (干货——MessageFormat.format 可以用实际的值来替换这些占位符)

    String msg = MessageFormat.format(“on {2}, a {0} destoryed {1} houses and caused {3} of damage”, “hurricane”, 99, new GregorianCalendar(1999,0,1).getTIme(), 10.0E8);

  • 1.3)如何替换: {0}被 hurricane 替换, {1} 被 99 替换, 等;

  • 1.4) 通过为占位符提供可选的格式,就可以做到这一点:

    on {2, date, long}, a {0} destoryed {1} houses and caused {3, number, currency} of damage ;
    替换参数后, on january 1, 1999, a hurricane destoryed 99 houses and caused $1000000 of damage;

2)一般来说,占位符索引后可以跟一个类型和一个风格,它们之间用逗号隔开,类型可以是:number + time + date + choice; (干货——占位符索引后可以跟一个类型和一个风格,注意类型list和风格list都有哪些)

  • 2.1)number 类型:可以是 integer, currency, percent, 或者可以是数字格式模式,就像 $ , ##0;
  • 2.2)如果类型是 time 或 date: 那么风格可以是 short, medium, long, full,或者是一个日期格式模式, 就像 yyyy-MM-dd;

Warning)静态的 MessageFormat.format 方法使用当前的locale 对值进行格式化。要想用任意的 locale 进行格式化, 还有一些工作要做, 因为这个类还没有提供任何可以使用的 varargs 方法, 你需要把将要格式化的值放置在 Object[] 数组中, 就想下面这样:

MessageFormat mf = new MessageFormat(pattern, loc);
String msg = mf.format(new Object[]{values});

3)看个荔枝(测试 选择格式化( 一个下限 + 一个格式字符串)以及不同Locale的formatter 和 format(pattern, Object… args)):

// 测试 选择格式化( 一个下限 + 一个格式字符串)以及不同Locale的formatterpublic static void main2(String[] args){String msg = "on {2, date, long}, a {0} destoryed {1} houses and caused {3, number, currency} of damage" ;// pattern == msg;String newMsg = MessageFormat.format(msg, new Object[]{"hurricane", 99, new GregorianCalendar(1999,0,1).getTime(), 10.0E8});System.out.println("locale[China] = " + newMsg); //Locale == 中国MessageFormat formatter = new MessageFormat(msg, Locale.US);String newMsg_US = formatter.format(new Object[]{"hurricane", 99, new GregorianCalendar(1999,0,1).getTime(), 10.0E8});System.out.println("locale[US] = " + newMsg_US);// Locale == US}// test for format(pattern, Object... args)public static void main1(){String str = "{0} | {1} | {0} | {1} | {2}";Object[] array = new Object[] { "A", "B", "C" };// format(pattern, Object... args);String msg = MessageFormat.format(str, array);System.out.println(msg); // A | B | A | B | C}



【2】 消息格式化之选择格式

1)problem+solution

  • 1.1)problem: “on {2}, a {0} destoryed {1} houses and caused {3} of damage. “, 如果用“earthquake” 来替换代表灾难的占位符{0}, 那么在英语中,这句话就不正确了,因为,
    on january 1, 1999, a earthquack destoryed, 因为 earthquake 的首字母是 e, 冠词是an 而不是 a;
  • 1.2)solution:我们希望消息能随占位符发生变化, 这样就能根据具体的值形成

    no houses
    one house
    2 houses

  • 1.3) choice 的格式化选项就是为了这个目的而设计的。 (干货——choice格式化选项)

    • 1.3.1)一个选择格式是由一个序列对构成的, 每一对都包括 : 一个下限 + 一个格式字符串;
    • 1.3.2)下限和格式字符串由一个 # 符号分割, 对与对之间由 符号 | 分割;
      如:{1, choice,0#no houses | 1#one house|2#{1} houses}
      0#no houses : 0 是 下限, # 是分割符, no houses 是格式化字符串;(注意 0, 1, 是下限,最低限度) (干货——选择格式化: 一个下限 + 一个格式字符串)
      1.3.3)下表显示了格式字符串对 {1} 的不同值产生的作用:

2)可以使用 < 符号来表示如果替换值严格小于下限,则选中这个选择项;也可以使用 ≤ (unicode中代码是 u\2264)来实现 和 # 相同 的效果。如果愿意的话,甚至可以将第一个下限值定义为 -∞(unicode 编码是 -\u221E);

例如: -∞ < no houses |0 < one house |2≤{1} houses; 或者使用 Unicode 转移字符: -\u221E < no houses | 0 < one house |2\u2264 {1} houses;

3)看个荔枝( 选择格式(no houses, one house, 3 houses)):

格式化命令为:  String pattern = “on {2, date, long}, {0} destoryed {1, choice, 0#no houses|1#one house|2#{1} houses}” + “and caused {3, number, currency} of damage”;

// 选择格式(no houses, one house, 3 houses)// 下限和格式字符串由一个 # 符号分割, 序列对间由 符号 | 分割;public static void main3(){//String msg = "{-\u221E<no houses|0<one house|2\u2264 {0} houses}";String msg = "{0, choice, 0#no houses|1#one house|2#{0} houses}";System.out.println(MessageFormat.format(msg, new Object[]{-1}));System.out.println(MessageFormat.format(msg, new Object[]{0}));System.out.println(MessageFormat.format(msg, new Object[]{1}));System.out.println(MessageFormat.format(msg, new Object[]{2}));     }


【3】文本文件和字符集

1) java是完全基于Unicode的,但是 os 一般有它们自己的字符编码,比如在 美国是 ISO-8859-1(8位代码,有时候也称为 ANSI 代码), 在台湾是 Big5;
2) 当把数据保存到一个文本文件中时,应该照顾到本地的字符编码,这样,用户就可以用它们的其他程序打开这个文本文件。

  • 2.1)字符编码是在 FileWriter 的构造器中指定的: out = newFileWriter(filename, “ISO-8859-1”);
  • 2.2)problem:遗憾的是, 目前,locale 和字符编码间没有任何联系。 比如, 你的 用户选择的是台湾的locale_zh_TW, 但是在 java中并没有提供任何方法来告诉你用 Big5 字符编码是最恰当的;

【4】源文件的字符编码

1)作为 coder, 要牢记你需要与java 编译器进行交互: 这种交互需要通过本地系统的工具来完成;
2)看个荔枝:

  • 2.1)使用中文版的记事本来写你的java 源代码文件, 但这样写出来的源代码不能随处使用;因为它们使用的是本地的字符编码;
  • 2.2)只有编译后的class 文件才能随处使用, 因为它们会自动地使用 “modified UTF-8” 编码来处理标识符和字符串。

3)这意味着即使在程序编译和运行时,依然有3种字符编码参与其中:

  • 3.1)源文件: 本地编码;
  • 3.2)类文件: modified UTF-8;
  • 3.3)虚拟机: UTF-16;

Attention)

  • A1) 可以用 -encoding 标记来设定你的源文件的字符编码, 如 , javac -encoding Big5 Myfile.java

4)为了使你的源文件到处都可用, 必须使用普通 的 ASCII 编码: 也就是说, 你需要将所有 非ASCII 字符转换成等价的 Unicode 编码;

  • 4.1)jdk 有一个工具 native2ascii :可以用它来将本地字符编码转换为 普通 的 ASCII , 这个工具直接将输入中的每一个非 ASCII 字符替换为 跟尾儿 \u 加上四位 16进制数字的Unicode值;(干货——native2ascii 工具的作用)
  • 4.2)如何使用 native2ascii 工具:
    native2ascii Myfile.java Myfile.temp
  • 4.3)用 -reverse 进行逆向转换:
    native2ascii -reverse myfile.temp myfily.java
  • 4.4)用 -encoding 选项指定另一种编码:编码的名字必须是 编码表所列出来的名字之一, 如: native2ascii -encoding Big5 myfile.java myfile.temp

5)看个荔枝(关于 native2ascii 工具)

  • 5.1)native2ascii HelloWorld.java HelloWorld.temp
  • 5.2)native2ascii -encoding Big5 HelloWorld.java HelloWorldTW.temp

  • 5.3)native2ascii -reverse HelloWorld.temp Reverse.java

java国际化——消息格式化+文本文件和字符集相关推荐

  1. java i18n实例_Java国际化(i18n)格式化日期

    本篇文章帮大家学习java国际化(i18n)格式化日期,包含了Java国际化(i18n)格式化日期使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. DateFormat类提 ...

  2. Java 国际化和字符集

    Java 国际化和字符集 一.国际化 1.Java中的国际化 2.Spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类. Spring 中国际化操作与Java原生 ...

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

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

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

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

  5. web项目上之深入理解Java国际化

    作者:https://blog.csdn.net/yangbo787827967/article/details/81124439 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客 ...

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

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

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

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

  8. java国际化实现_JAVA实现国际化

    1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...

  9. java国际化韩文_java国际化介绍+Demo

    引言 今天小编听到了一个词:国际化.现在全球都要多元化了,所以程序国际化也是顺势而出的--(ps:其实这个早就有了,小编也是硬扯到一起的!) 国际化简介 国际化的英文为Internationaliza ...

最新文章

  1. mongodb基本操作=增删改查
  2. 转Java工程师成神之路
  3. 3.2.5 端到端的学习
  4. 赤峰市职称计算机,关注丨赤峰今年评职称最新政策全在这……
  5. 使用摄像头录像后,需要删除系统缓存数据!
  6. linux下nginx启动停止重启控制脚本
  7. TensorFlow笔记(10) CheckPoint
  8. php phar,PHP中phar(PHP Archive)包的创建并使用
  9. 常用Git命令和配置
  10. 计算机网络rip工作原理,12. 小型网络 RIP 协议工作原理
  11. 租用服务器怎么免去后顾之忧?
  12. 台达DVP系列PLC以太网通讯方案
  13. 揭秘!女程序员为啥更赚钱?这4个大招,用Python做副业躺赚
  14. Python 爬取微信公众号文章
  15. keil5打开工程文件显示空白bug
  16. iOS开发 动画(Animation)图片360度不停旋转
  17. 【看表情包学Linux】软件包管理器 yum | Vim 编辑器介绍 | Vim 文本批量化操作 | 配置 Vim
  18. 09-kafka分区数的设置
  19. android手机功能创新,盘点最让人心动的五大手机差异化创新趋势
  20. 应用检查后台启动权限方法(小米官方给出的)

热门文章

  1. CF641D. Little Artem and Random Variable
  2. P2305 [NOI2014]购票
  3. [BZOJ3944] Sum
  4. 踩不出足迹(牛客练习赛88 )
  5. Acwing1086. 恨7不成妻(未解决)
  6. 牛客网【每日一题】4月30日题目精讲 换个角度思考
  7. 51nod1229-序列求和V2【数学,拉格朗日插值】
  8. P4300-[AHOI2006]上学路线【网络流,最短路】
  9. P3188-[HNOI2007]梦幻岛宝珠【背包】
  10. nssl1299-选做作业【最大流,最小割,最大子权闭合图】