Java I18n 简明教程
Java Internationalization - Overview
Java Internationalization - Environment Setup
在本章,我们将讨论为 Java 设置宜人环境的事物的不同方面。
Local Environment Setup
如果您仍然希望为 Java 编程语言设置您的环境,本文将指导您如何在您的机器上下载和设置 Java。以下是设置环境的步骤。
Java SE 可以通过链接 Download Java 免费获得。您可以根据您的操作系统下载一个版本。
按照说明下载 Java 并运行 .exe 以在您的机器上安装 Java。一旦您在您的机器上安装了 Java,您将需要设置环境变量来指向正确的安装目录 −
Popular Java Editors
要编写 Java 程序,您将需要一个文本编辑器。市场上有更复杂的 IDE。但现在,您可以考虑以下内容之一 −
-
Notepad − 在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(推荐用于本教程)、TextPad。
-
Netbeans − 一个开源免费的 Java IDE,可以从 https://www.netbeans.org/index.html 下载。
-
Eclipse − 一个由 Eclipse 开源社区开发的 Java IDE,可从 https://www.eclipse.org/ 下载。
Java Internationalization - Locale Class
Locale 对象表示特定的地理/政治/文化区域。需要 Locale 来执行其任务的任何操作称为区域敏感操作,并使用 Locale 来掌握与用户相关的信息。例如,显示数字就是区域敏感操作。该数字应按照用户所在国家、地区或文化的习俗和惯例进行格式化。
Locale Contents
Locale 对象包含以下内容:
-
Language - ISO 639 alpha-2 或 alpha-3 语言代码,或最多包含 8 个字母的注册语言子标签。如果同时存在 alpha-2 和 alpha-3 代码,则必须使用 alpha-2 代码。语言字段不区分大小写,但 Locale 始终规范化为小写。
-
Script - ISO 15924 alpha-4 脚本代码。脚本字段不区分大小写,但 Locale 始终规范化为首字母大写。
-
Country (region) - ISO 3166 alpha-2 国家代码或 UN M.49 数字 3 区域代码。国家字段不区分大小写,但 Locale 始终规范化为大写。
-
Variant - 用于指示 Locale 变化的任何任意值。如果存在两个或更多个指示其自身语义的变体值,则应按重要性对这些值进行排序,最重要的值排在最前面,并用下划线 (“_”) 分隔。变体字段区分大小写。
-
Extensions ——表示语言识别之外的扩展的一个映射,它来自单一字符键到字符串值。Locale 中的扩展实现 BCP 47 扩展子标记和专用子标记的语义和语法。扩展不区分大小写,但 Locale 会将所有扩展键和值规范化为小写。
Java Internationalization - Example - Locale Details
在此示例中,我们将获取默认语言环境并打印其详细信息。然后为“fr”创建语言环境并打印其详细信息。
Example
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale locale =Locale.getDefault();
System.out.println("Default Locale Properties:\n");
System.out.println(locale.getDisplayCountry());
System.out.println(locale.getDisplayLanguage());
System.out.println(locale.getDisplayName());
System.out.println(locale.getISO3Country());
System.out.println(locale.getISO3Language());
System.out.println(locale.getLanguage());
System.out.println(locale.getCountry());
Locale frenchLocale = new Locale("fr","fr");
System.out.println("\nfr Locale Properties:\n");
System.out.println(frenchLocale.getDisplayCountry());
System.out.println(frenchLocale.getDisplayLanguage());
System.out.println(frenchLocale.getDisplayName());
System.out.println(frenchLocale.getISO3Country());
System.out.println(frenchLocale.getISO3Language());
System.out.println(frenchLocale.getLanguage());
System.out.println(frenchLocale.getCountry());
}
}
Java Internationalization - Example - Display Language
在此示例中,我们将获取作为参数传递的语言每区域显示。
Example
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale defaultLocale = Locale.getDefault();
Locale enLocale = new Locale("en", "US");
Locale frLocale = new Locale("fr", "FR");
Locale esLocale = new Locale("es", "ES");
System.out.println(defaultLocale.getDisplayLanguage(enLocale));
System.out.println(defaultLocale.getDisplayLanguage(frLocale));
System.out.println(defaultLocale.getDisplayLanguage(esLocale));
}
}
Java Internationalization - ResourceBundle Class
ResourceBundle 类用于存储与语言环境相关的文本和对象。我们通常使用属性文件来存储特定语言环境的文本并使用 ResourceBundle 对象来表示它们。以下是 Java 中基于应用程序使用特定语言环境的属性文件的步骤。
Step 1: Create Properties Files.
假设我们需要英语语言环境的属性文件。然后创建一个属性文件名称为 XXX_en_US.properties,其中 XXX 是文件名称,而 en_US 表示英语 (美国) 的语言环境。
Messages_en_US.properties
message=Welcome to TutorialsPoint.COM!
现在,让我们为法语语言环境创建一个属性文件。然后创建一个名为 XXX_fr_FR.properties 的属性文件,其中 XXX 是文件名称,而 fr_FR 代表法语 (法国) 的语言环境。
Messages_fr_FR.properties
message=Bienvenue sur TutorialsPoint.COM!
在这里你可以发现键是相同的,但值在两个属性文件中属于特定语言环境。
Step 2: Create ResourceBundle Object
使用属性文件名称和语言环境通过以下语法创建 ResourceBundle 对象。
ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);
Step 3: Get the Value from ResourceBundle Object
通过传递键从 ResourceBundle 对象获取值。
String value = bundle.getString("message");
Example
以下示例说明如何使用 ResourceBundle 对象从属性文件中显示特定语言环境的值。
import java.util.Locale;
import java.util.ResourceBundle;
public class I18NTester {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);
System.out.println("Message in "+Locale.US +": "+bundle.getString("message"));
bundle = ResourceBundle.getBundle("Messages", Locale.FRANCE);
System.out.println("Message in "+Locale.FRANCE +": "+bundle.getString("message"));
}
}
它将打印以下结果。
Message in en_US: Welcome to TutorialsPoint.COM!
Message in fr_FR: Bienvenue sur TutorialsPoint.COM!
Java Internationalization - NumberFormat Class
java.text.NumberFormat 类用于根据特定区域设置对数字和货币进行格式化。数字格式因国家/地区而异。例如,丹麦使用逗号将数字的小数部分与整数部分分隔开,而英国使用句点作为分隔符。
Example - Format Numbers
在此示例中,我们根据美国语言环境和丹麦语言环境格式化数字。
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US");
Locale daLocale = new Locale("da", "DK");
NumberFormat numberFormat = NumberFormat.getInstance(daLocale);
System.out.println(numberFormat.format(100.76));
numberFormat = NumberFormat.getInstance(enLocale);
System.out.println(numberFormat.format(100.76));
}
}
Java Internationalization - Format Currencies
Example
在此示例中,我们将根据美国语言环境和丹麦语言环境格式化货币。
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US");
Locale daLocale = new Locale("da", "DK");
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(daLocale);
System.out.println(numberFormat.format(100.76));
numberFormat = NumberFormat.getCurrencyInstance(enLocale);
System.out.println(numberFormat.format(100.76));
}
}
Java Internationalization - Format Percentages
Example
在此示例中,我们按百分比格式设置数字。
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US");
NumberFormat numberFormat = NumberFormat.getPercentInstance(enLocale);
System.out.println(numberFormat.format(0.76));
}
}
Java Internationalization - Set Min/Max Precision
Example
在此示例中,我们为数字的整数部分和小数部分设置最小和小数位。
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US");
NumberFormat numberFormat = NumberFormat.getInstance(enLocale);
numberFormat.setMinimumIntegerDigits(2);
numberFormat.setMaximumIntegerDigits(3);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(3);
System.out.println(numberFormat.format(12234.763443));
}
}
Java Internationalization - Set Rounding Mode
Example
在此示例中,我们展示了舍入模式。
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US");
NumberFormat numberFormat = NumberFormat.getInstance(enLocale);
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMaximumFractionDigits(0);
System.out.println(numberFormat.format(99.50));
numberFormat.setRoundingMode(RoundingMode.HALF_DOWN);
System.out.println(numberFormat.format(99.50));
}
}
Java Internationalization - Parsing Numbers
Example
在此示例中,我们展示了在不同语言环境中出现的数字的解析。
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) throws ParseException {
Locale enLocale = new Locale("en", "US");
Locale daLocale = new Locale("da", "DK");
NumberFormat numberFormat = NumberFormat.getInstance(daLocale);
System.out.println(numberFormat.parse("100,76"));
numberFormat = NumberFormat.getInstance(enLocale);
System.out.println(numberFormat.parse("100,76"));
}
}
Java Internationalization - DecimalFormat Class
java.text.DecimalFormat 类用于按照自定义格式和区域设置对数字进行格式化。
Example - Format Numbers
在此示例中,我们根据给定的模式格式化数字。
import java.text.DecimalFormat;
public class I18NTester {
public static void main(String[] args) {
String pattern = "####,####.##";
double number = 123456789.123;
DecimalFormat numberFormat = new DecimalFormat(pattern);
System.out.println(number);
System.out.println(numberFormat.format(number));
}
}
Java Internationalization - Format Patterns
以下是格式化模式中字符的用法。
Sr.No. |
Class & Description |
1 |
0 如果存在的位数不够,则显示 0。 |
2 |
# 显示数字,省略前导零。 |
3 |
. Decimal separator. |
4 |
, Grouping separator. |
5 |
E 指数格式的尾数和指数分隔符。 |
6 |
; Format separator. |
7 |
- Negative number prefix. |
8 |
% 以百分比显示数字,乘以 100 后显示。 |
9 |
? 以千分比显示数字,乘以 1000 后显示。 |
10 |
X 用于将字符标记为数字的前缀/后缀。 |
11 |
' 用于标记特殊字符周围的引号。 |
Example
在此示例中,我们会按照不同的模式对数字进行格式化。
import java.text.DecimalFormat;
public class I18NTester {
public static void main(String[] args) {
String pattern = "###.###";
double number = 123456789.123;
DecimalFormat numberFormat = new DecimalFormat(pattern);
System.out.println(number);
//pattern ###.###
System.out.println(numberFormat.format(number));
//pattern ###.#
numberFormat.applyPattern("###.#");
System.out.println(numberFormat.format(number));
//pattern ###,###.##
numberFormat.applyPattern("###,###.##");
System.out.println(numberFormat.format(number));
number = 9.34;
//pattern 000.###
numberFormat.applyPattern("000.##");
System.out.println(numberFormat.format(number));
}
}
Java Internationalization - Locale Specific DecimalFormat
默认情况下,DecimalFormat 对象使用 JVM 的区域设置。我们可以在创建 DecimalFormat 对象时使用 NumberFormat 类更改默认区域设置。在以下示例中,我们将针对两个不同区域设置使用相同的模式,您可以在输出中发现差异。
Example
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
String pattern = "###.##";
double number = 123.45;
Locale enlocale = new Locale("en", "US");
Locale dalocale = new Locale("da", "DK");
DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(enlocale);
decimalFormat.applyPattern(pattern);
System.out.println(decimalFormat.format(number));
decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(dalocale);
decimalFormat.applyPattern(pattern);
System.out.println(decimalFormat.format(number));
}
}
Java Internationalization - DecimalFormatSymbols Class
使用 DecimalFormatSymbols 类,可以更改默认分隔符符号、分组分隔符符号等。以下示例对此进行了说明。
Example
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class I18NTester {
public static void main(String[] args) {
String pattern = "#,###.###";
double number = 126473.4567;
DecimalFormat decimalFormat = new DecimalFormat(pattern);
System.out.println(decimalFormat.format(number));
DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator(';');
decimalFormatSymbols.setGroupingSeparator(':');
decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);
System.out.println(decimalFormat.format(number));
}
}
Java Internationalization - Grouping Digits
使用 DecimalFormat 的 setGroupingSize() 方法,可以更改数字的默认分组。以下示例对此进行了说明。
Example
import java.text.DecimalFormat;
public class I18NTester {
public static void main(String[] args) {
double number = 121223232473.4567;
DecimalFormat decimalFormat = new DecimalFormat();
System.out.println(number);
System.out.println(decimalFormat.format(number));
decimalFormat.setGroupingSize(4);
System.out.println(decimalFormat.format(number));
}
}
Java Internationalization - DateFormat Class
java.text.DateFormat 类根据语言环境格式化日期。由于不同的国家使用不同的格式显示日期。该类在处理应用程序的国际化中的日期时非常有用。以下示例展示了如何创建和使用 DateFormat 类。
Example
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) {
Locale locale = new Locale("da","DK");
DateFormat dateFormat = DateFormat.getDateInstance();
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
System.out.println(dateFormat.format(new Date()));
}
}
Java Internationalization - Formatting Dates
DateFormat 类提供各种格式来格式化日期。以下是其中一些格式的列表。
-
DateFormat.DEFAULT
-
DateFormat.SHORT
-
DateFormat.MEDIUM
-
DateFormat.LONG
-
DateFormat.FULL
Example
在以下示例中,我们将演示如何使用不同的格式。
import java.text.DateFormat;
import java.util.Date;
public class I18NTester {
public static void main(String[] args) {
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
System.out.println(dateFormat.format(new Date()));
}
}
Java Internationalization - Formatting Time
DateFormat 类提供了各种格式来格式化时间。应使用 DateFormat.getTimeInstance() 方法。请参见以下示例。
Example
在以下示例中,我们将展示如何使用不同的格式来格式化时间。
import java.text.DateFormat;
import java.util.Date;
public class I18NTester {
public static void main(String[] args) {
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getTimeInstance(DateFormat.LONG);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getTimeInstance(DateFormat.FULL);
System.out.println(dateFormat.format(new Date()));
}
}
Java Internationalization - Formatting Date and Time
DateFormat 类通过提供各种格式,将日期和时间组合起来进行格式化。须使用 DateFormat.getDateTimeInstance() 方法。请参见下面的示例。
Example
在以下示例中,我们将演示如何使用不同的格式对日期和时间进行格式化。
import java.text.DateFormat;
import java.util.Date;
public class I18NTester {
public static void main(String[] args) {
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
System.out.println(dateFormat.format(new Date()));
dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
System.out.println(dateFormat.format(new Date()));
}
}
Java Internationalization - SimpleDateFormat Class
java.text.SimpleDateFormat 类根据给定的模式对日期进行格式化。它还用于从字符串中解析日期,字符串中包含指定格式的日期。请参见以下使用 SimpleDateFormat 类的示例。
Example
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class I18NTester {
public static void main(String[] args) throws ParseException {
String pattern = "dd-MM-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = new Date();
System.out.println(date);
System.out.println(simpleDateFormat.format(date));
String dateText = "29-11-2017";
date = simpleDateFormat.parse(dateText);
System.out.println(simpleDateFormat.format(date));
}
}
Java Internationalization - Locale specific SimpleDateFormat
区域设置可用于在 SimpleDateFormat 类的模式中创建特定于区域设置的格式化。请参阅以下使用特定于区域设置的 SimpleDateFormat 类的示例。
Example
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class I18NTester {
public static void main(String[] args) throws ParseException {
Locale locale = new Locale("da", "DK");
String pattern = "EEEEE MMMMM yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = new Date();
System.out.println(date);
System.out.println(simpleDateFormat.format(date));
simpleDateFormat = new SimpleDateFormat(pattern,locale);
System.out.println(simpleDateFormat.format(date));
}
}
Java Internationalization - DecimalFormatSymbols Class
使用 DecimalFormatSymbols 类,可以更改默认分隔符符号、分组分隔符符号等。以下示例对此进行了说明。
Example
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class I18NTester {
public static void main(String[] args) {
String pattern = "#,###.###";
double number = 126473.4567;
DecimalFormat decimalFormat = new DecimalFormat(pattern);
System.out.println(decimalFormat.format(number));
DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator(';');
decimalFormatSymbols.setGroupingSeparator(':');
decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);
System.out.println(decimalFormat.format(number));
}
}
Java Internationalization - Date Format Patterns
以下是字符在日期格式化模式中的用途。
Sr.No. |
Class & Description |
1 |
G To display Era. |
2 |
y 用于显示年份。有效值 yy、yyyy。 |
3 |
M 用于显示月份。有效值 MM、MMM 或 MMMMM。 |
4 |
d 用于显示当月的日期。有效值 d、dd。 |
5 |
h 用于显示一天中的小时(上午/下午 1-12)。有效值 hh。 |
6 |
H 用于显示一天中的小时(0-23)。有效值 HH。 |
7 |
m 用于显示小时中的分钟(0-59)。有效值 mm。 |
8 |
s 用于显示分钟中的秒(0-59)。有效值 ss。 |
9 |
S 用于显示分钟中的毫秒(0-999)。有效值 SSS。 |
10 |
E 用于显示一周中的日期(例如星期一、星期二等) |
11 |
D 显示一年中的第几天(1-366)。 |
12 |
F 显示一个月中的第几周(例如 12 月的第一个星期四)。 |
13 |
w 显示一年中的第几周(1-53)。 |
14 |
W 显示一个月中的第几周(0-5) |
15 |
a 显示 AM / PM |
16 |
k 显示一天中的第几小时(1-24)。 |
17 |
K 显示一天中的第几小时,AM / PM(0-11)。 |
18 |
z To display Time Zone. |
Example
在这个示例中,我们根据不同的模式设置日期的格式。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class I18NTester {
public static void main(String[] args) throws ParseException {
String pattern = "dd-MM-yy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = new Date();
System.out.println(simpleDateFormat.format(date));
pattern = "MM-dd-yyyy";
simpleDateFormat = new SimpleDateFormat(pattern);
System.out.println(simpleDateFormat.format(date));
pattern = "yyyy-MM-dd HH:mm:ss";
simpleDateFormat = new SimpleDateFormat(pattern);
System.out.println(simpleDateFormat.format(date));
pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
simpleDateFormat = new SimpleDateFormat(pattern);
System.out.println(simpleDateFormat.format(date));
}
}
Java Internationalization - UTC
UTC 代表协调世界时。它是时间标准,在世界各地普遍使用。所有时区都与 UTC 进行比较计算,作为偏移量。例如,丹麦哥本哈根的时间是 UTC + 1,表示 UTC 时间加一小时。它与夏令时无关,应该用于在数据库中存储日期和时间。
Conversion of time zones
下面的示例将展示各种时区的转换。我们将打印一天中的小时和时间(以毫秒为单位)。第一个将变化,第二个将保持不变。
Example
import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class I18NTester {
public static void main(String[] args) throws ParseException {
Calendar date = new GregorianCalendar();
date.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
date.set(Calendar.HOUR_OF_DAY, 12);
System.out.println("UTC: " + date.get(Calendar.HOUR_OF_DAY));
System.out.println("UTC: " + date.getTimeInMillis());
date.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
System.out.println("CPH: " + date.get(Calendar.HOUR_OF_DAY));
System.out.println("CPH: " + date.getTimeInMillis());
date.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("NYC: " + date.get(Calendar.HOUR_OF_DAY));
System.out.println("NYC: " + date.getTimeInMillis());
}
}
它将打印以下结果。
UTC: 12
UTC: 1511956997540
CPH: 13
CPH: 1511956997540
NYC: 7
NYC: 1511956997540
Available Time Zones
下面的示例将展示系统中可用的时区。
Example
import java.text.ParseException;
import java.util.TimeZone;
public class I18NTester {
public static void main(String[] args) throws ParseException {
String[] availableIDs = TimeZone.getAvailableIDs();
for(String id : availableIDs) {
System.out.println("Timezone = " + id);
}
}
}
它将打印以下结果。
Timezone = Africa/Abidjan
Timezone = Africa/Accra
...
Timezone = VST
Java Internationalization - Unicode Conversion from/to String
在 Java 中,文本以 Unicode 格式内部存储。如果输入/输出采用不同格式,则需要进行转换。
Conversion
以下示例将展示如何将 Unicode 字符串转换为 UTF8 字节数组,将 UTF8 字节数组转换为 Unicode 字节数组。
Example
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.text.ParseException;
public class I18NTester {
public static void main(String[] args) throws ParseException, UnsupportedEncodingException {
String unicodeString = "\u00C6\u00D8\u00C5" ;
//convert Unicode to UTF8 format
byte[] utf8Bytes = unicodeString.getBytes(Charset.forName("UTF-8"));
printBytes(utf8Bytes, "UTF 8 Bytes");
//convert UTF8 format to Unicode
String converted = new String(utf8Bytes, "UTF8");
byte[] unicodeBytes = converted.getBytes();
printBytes(unicodeBytes, "Unicode Bytes");
}
public static void printBytes(byte[] array, String name) {
for (int k = 0; k < array.length; k++) {
System.out.println(name + "[" + k + "] = " + array[k]);
}
}
}
它将打印以下结果。
UTF 8 Bytes[0] = -61
UTF 8 Bytes[1] = -122
UTF 8 Bytes[2] = -61
UTF 8 Bytes[3] = -104
UTF 8 Bytes[4] = -61
UTF 8 Bytes[5] = -123
Unicode Bytes[0] = -58
Unicode Bytes[1] = -40
Unicode Bytes[2] = -59
Java Internationalization - Unicode Conversion from/to Reader/Writer
读取器和写入器类是面向字符的流类。这些可用于读取和转换 Unicode 字符。
Conversion
以下示例将展示如何使用读取器和写入器类将 Unicode 字符串转换为 UTF8 字节数组,将 UTF8 字节数组转换为 Unicode 字节数组。
Example
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.ParseException;
public class I18NTester {
public static void main(String[] args) throws ParseException, IOException {
String input = "This is a sample text" ;
InputStream inputStream = new ByteArrayInputStream(input.getBytes());
//get the UTF-8 data
Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
//convert UTF-8 to Unicode
int data = reader.read();
while(data != -1){
char theChar = (char) data;
System.out.print(theChar);
data = reader.read();
}
reader.close();
System.out.println();
//Convert Unicode to UTF-8 Bytes
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));
writer.write(input);
writer.close();
String out = new String(outputStream.toByteArray());
System.out.println(out);
}
}
它将打印以下结果。
This is a sample text
This is a sample text