要考慮一個(gè)真正意義的全球資源,Web瀏覽器的內(nèi)容對(duì)每個(gè)接收到的用戶來說都是易讀的,現(xiàn)在大多數(shù)的全球資源的網(wǎng)站都是英文的.當(dāng)然,現(xiàn)在也在發(fā)生變化,有的網(wǎng)站為一些特定的國家定制一些非英文版本,比如,說英文的通過http://www.ibm.com/en/index.html來訪問,說中文的通過http://www.imb.com/cn/index.html來訪問,這些很多都是靜態(tài)的文本.怎么構(gòu)件一個(gè)動(dòng)態(tài)生成的國際化內(nèi)容的網(wǎng)站就不是一個(gè)簡(jiǎn)單的問題了.
國際化又稱Il8N,因?yàn)橛⑽膰业膰一荌nternationalization,它以I開始,以N結(jié)束,共18個(gè)字母.本地化又稱L18N,即是Localization.國際化的問題主要包含以下的一些內(nèi)容:
.日期,時(shí)間
.數(shù)字
.貨幣
.其它的一些特殊字符
也就是說不同的Locale,顯示日期,時(shí)間格式是不一樣的.當(dāng)然,不同的語言有自己不同的字符集.
HTML中的字符實(shí)體
HTML中的字符實(shí)體和XML的語言保持一致.它定義了用特定的字符序列顯示單字符的功能,這種字符序列稱為字符實(shí)體,它以" &"開頭,以";"結(jié)束.例如: © 表示字符"?";
看一例子顯示西班牙語的" Hello World":
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "
<%
?? response.setHeader("Content-Language","es");
?? out.println("<html><head><title>En Español</title></head>");
?? out.println("<body>");
?? out.println("<h3>En espa%ntilde;ol</h3>");
?? out.println("¡Hola Mundo!");
?? out.println("</body></html>");
%>
運(yùn)行結(jié)果:
En espa%ntilde;ol
?Hola Mundo!
在HTML字符實(shí)體表示中,ñ代表了" ? "字符,使用response.setHeader("Content-Language","es");來設(shè)置HTML顯示時(shí)要使用的語言.
Unicode
Unicode字符標(biāo)準(zhǔn)是一個(gè)字符編碼系統(tǒng),它支持互相轉(zhuǎn)換,處理和顯示現(xiàn)在世界上不同語言的文本.在Java語言中,字符,字符串和標(biāo)始符在內(nèi)部使用16位的Unicode 2.0字符集表示.Unicode使用 " \uxxxx" 來表示一個(gè)字符,前256個(gè)Unicode字符和ISO-8859-1標(biāo)準(zhǔn)(Latin-1)的前256個(gè)字符一致.在Unicode世界中, "? ?? " 用 " \u00f1 " 表示.看怎么用Unicode來編寫西班牙語的Hello World:
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "
<%
?? response.setHeader("Content-Language","es");
?? out.println("<html><head><title>En Espa\u00f1ol</title></head>");
?? out.println("<body>");
?? out.println("<h3>En espa\u00f1ol</h3>");
?? out.println("\u00f1Hola Mundo!");
?? out.println("</body></html>");
%>
支持多國語言的Hello World
用語選擇語言的頁面:
語言處理頁面代碼:
<%@page contentType="text/plain;charset=UTF-8"
import="java.io.*,java.text.*,java.util.*,javax.servlet.jsp.*" %>
<html>
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
??????? <title>JSP Page</title>
??? </head>
??? <body>
<%!
?? Locale locale;
?? DateFormat format;
?? JspWriter writer;
%>
<%!
?? //英語
void processEnglish()throws Exception
{
??? locale=new Locale("en","US");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in english");
??? writer.println("<br>");
??? writer.println("HelloWorld");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
?? //中文
void processChinese()throws Exception
{
??? locale=new Locale("zh","");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in Chinese");
??? writer.println("<br>");
??? writer.println("\u4f60\u597d\u4e16\u754c");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
?? //韓國語
void processKorean()throws Exception
{
??? locale=new Locale("ko","");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in Korean");
??? writer.println("<br>");
??? writer.println("\uc548\ud558\uc138\uacc4");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
//.........................其他的語言省略
%>
<%
??? //獲得請(qǐng)求的語種
???? String language=(String)request.getParameter("language");
???? int lan=Integer.parseInt(language);??
%>
<%
?? writer=out;
?? switch(lan)
?? {
?????? case 1:processEnglish();break;
?????? case 2:processChinese();break;
?????? case 3:processKorean();break;
?????? //case 4:processRussian();break;
?????? //case 5:processSpanish();break;
????? // case 6:processJapanese();break;
?? }
%>
??? </body>
</html>
處理的思路很簡(jiǎn)單,首先獲得請(qǐng)求的語種,然后根據(jù)不同的語言來做不同的處理.