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

【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

  • 这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 8 新功能详解_Java 8和Java 14之间的新功能

java 8 新功能详解从版本9开始&#xff0c;Java每6个月就有一次新功能&#xff0c;因此很难跟踪这些新更改。 互联网上的大多数信息都描述了最近2个Java版本之间的变化。 但是&#xff0c;如果您的情况与我相似&#xff0c;则说明您使用的不是Java的最新版本&#xff0c;而是使…

Tomcat配置虚拟内存

一、Tomcat启动参数JAVA_OPTS参数说明   -server 启用jdk 的 server 版&#xff1b;   -Xms java 虚拟机初始化时的堆最小内存&#xff1b;   -Xmx java 虚拟机可使用堆的最大内存&#xff1b;   -XX: PermSize 非堆内存永久保留区域   -XX:MaxPermS…

ISO语言代码和国家代码+Locale常量+ISO货币符号

【1】ISO语言代码和国家代码 【2】Locale常量 【3】ISO货币符号

djl和ljl_使用Spring Boot和DJL进行深度学习

djl和ljl总览 这是Spring Boot上的另一篇文章 &#xff0c;该文章将展示如何使用Deep Java Library &#xff08;DJL&#xff09;构建示例Web应用程序&#xff0c; Deep Java Library &#xff08;DJL&#xff09;是Java的开源深度学习库&#xff0c;用于诊断X射线图像上的COVI…

java BigDecimal八种舍入模式

一、BigDecimal介绍java.math.BigDecimal不可变的immutable、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。标度(scale)如果为零或正数&#xff0c;则标度是小数点后的位数。如果为负数&#xff0c;则将该数的非标度值乘以10的…

java国际化——资源包

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 旨在理解 java国际化——资源包 的基础知识 &#xff1b; 2&#xff09; 本文源代码idea 转自&#xff1a; &#xff08;利用properties 文件进行国际化&#xff09;https://docs.oracle.co…

ui自动化测试测试报告_您需要了解的有关UI测试的所有信息

ui自动化测试测试报告让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么&#xff1f; 接口&#xff0c;当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败&#xff0c;这就是为什么越来越多的人选择对其Web应用程序…

Tomcat解决HTTP GET中文乱码

一、中文乱码原因 Tomcat默认是按ISO-8859-1进行URL解码&#xff0c;ISO-8859-1并未包括中文字符&#xff0c;中文字符不能被正确解析了。 二、配置编码 在tomcat的conf/server.xml下的connetor属性中增加URIEncoding或者useBodyEncodingForURI属性 &#xff08;1&#xff0…

NanoHTTPD web server的一个简单荔枝

【0】README 0.1&#xff09;本文旨在演示一个简单荔枝&#xff0c;以说明如何使用 NanoHTTPD web server 和 浏览器访问 该server的效果 -------------------------------------------------------------- App.java public class App extends NanoHTTPD {public App() thr…

throwable_您想了解的所有Throwable

throwable本文是有关异常的教程。 但不是通常的一种。 其中有许多内容可以告诉您异常的含义&#xff0c;如何抛出异常&#xff0c;捕获异常&#xff0c;已检查异常和运行时异常之间的区别&#xff0c;等等。 没有必要了。 这对您来说也很无聊。 如果没有&#xff0c;那么请阅读…

Linux Tomcat安装

一、linux 安装软件的步骤 &#xff08;1&#xff09;下载软件的压缩包 &#xff08;2&#xff09;解压到指定的目录 &#xff08;3&#xff09;配置环境变量 &#xff0c;配置PATH&#xff08;在任意目录启动&#xff0c;这PATH可以省略&#xff0c;若不配置只有安装目录才…

java分布式对象(RMI+部署使用RMI的程序)

【0】README 1&#xff09;本文文字转自 core java volume 2&#xff0c; 旨在学习 java 分布式对象的相关知识&#xff1b; 2&#xff09; RMI 的实例程序为原创&#xff1b; 3&#xff09; RMI部署步骤的测试用例&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/arti…

java 创建uri_使用UriBuilder快速创建URI

java 创建uri如果您有权访问JAX-RS API和项目中的实现&#xff08;很多&#xff09;&#xff0c;则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子&#xff1a; String host System.getProperty( "host" , "localh…

Tomcat 服务自动启动

一、配置/etc/rc.local rc.local是linux启动init之后执行的脚本。 sudo vi /etc/rc.local 添加如下一行 /home/myuser/software/apache-tomcat-7.0.29/bin/startup.sh&#xff08;脚本绝对路径&#xff09; 二、sysv-rc-conf 工具配置 1、安装 sysv-rc-conf sudo apt-get …

java分布式对象RMI应用测试用例

【0】README 0.1&#xff09;本文旨在对http://blog.csdn.net/PacosonSWJTU/article/details/50705192 中的代码进行实践&#xff08;如何部署一个使用RMI框架的程序以进行远程调用&#xff09;&#xff1b; 0.2&#xff09; for complete source code, please visit https…

neo4j 迁移_在Kubernetes中迁移Neo4j图模式

neo4j 迁移在零停机时间下运行企业应用程序时&#xff0c;我们需要能够执行数据库架构迁移而又不中断活动用户。 这不仅对于关系数据库很重要&#xff0c;而且对于诸如Neo4J之类的图数据库也很重要&#xff0c;后者不会在write上强制执行架构。 但是&#xff0c;重构图形并使图…

Windows访问Linux的Tomcat,显示无法连接

一、端口占用 先查看tomcat下的logs日志文件&#xff0c;如果现实地址已被占用&#xff0c;则需重新修改端口。 tomcat默认启动的是8080&#xff0c;如果你想修改为80&#xff0c;则需要修改server.xml文件:vim $CATALINA_HOME/conf/server.xml #如果没有配置$CATALINA_HOME&am…

java分布式对象——远程方法中的参数和返回值+远程对象激活

【0】README 1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java分布式对象——远程方法中的参数和返回值远程对象激活 的相关知识&#xff1b; 【1】远程方法中的参数和返回值 1&#xff09; 在开始进行远程方法调用时&#xff0c;调用参数需要从…

wcf:rest_REST:管理多对多关系

wcf:rest介绍 管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中&#xff0c;我们将看到使用REST API可以管理多对多关系。 我们以一个简单的用户 / 组关系为例。 假设用户和组是两个单独的资源&#xff08;例如/ users和/ groups &#xff09;&#xff…

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全 的相关知识&#xff1b; 【1】类加载器 1&#xff09;java 技术提供了以下3种确保安全的机制&#xff08;mechanism&#xff09;&#xff1a; m1&#xff09;语言设计特性&am…