仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 639|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA网站制作之从汉化到国际化

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:28:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.择要:
1依照JAVA的国际化计划框架标准:怎样经由过程Linux体系的当地化设置让JAVA使用撑持中文
2依照JavaWebapp计划框架标准:经由过程web.xml设置办理URLEncoder.encode()办法和体系缺省编码体例相干的成绩
3以GOOGLE的搜刮引擎为例:申明怎样将国际化和当地化使用到本人的使用计划中(UnicodeinsideLocaleoutsite)

经由过程Linux体系的当地化设置让JAVA使用撑持中文

Java编程手艺中汉字成绩的剖析及办理这篇文章很不错,直到比来还常常被一些网站转贴,个中有一个例子申明了良多中国程序员碰到汉字乱码成绩的思绪:"GB2312it"(汉化)

原文以下:
>>>>>>>
......前不久,我的一名手艺上的伴侣发信给我说,他终究找到了JavaServlet中文成绩的本源。两周以来,他一向为JavaServlet的中文成绩所困扰,由于每面临一个含有中笔墨符的字符串都必需举行强迫转换才干够失掉准确的了局(这好象是人人公认的独一的办理举措)。厥后,他的确不想云云持续循分下往了,由于如许的事变的确不该该是初级程序员所要做的事情,他就找出Servlet解码的源代码举行剖析,由于他嫌疑成绩就出在解码这部分。经由四个小时的搏斗,他终究找到了成绩的本源地点。本来他的嫌疑是准确的,Servlet的解码部分完整没有思索双字节,间接把%XX看成一个字符。(本来JavaSoft也会犯这幺初级的毛病!)

假如你对这个成绩有乐趣大概碰到了一样的懊恼的话,你能够依照他的步骤对Servlet.jar举行修正:

找到源代码HttpUtils中的staticprivateStringparseName,在前往前将sb(StringBuffer)复制成bytebs[],然后returnnewString(bs,”GB2312”)。作上述修正后就必要本人解码了:

HashTableform=HttpUtils.parseQueryString(request.getQueryString())大概

form=HttpUtils.parsePostData(……)

万万别忘了编译后放到Servlet.jar内里。
......
<<<<<<<<<

叨教“初级”程序员几个成绩:
1假如这是一个贸易产物的话,岂非客户必要你Hacking过的Servlet.jar才运转这个使用吗?
2岂非这个产物只能用在中文GB2312上吗?假如是日文使用怎样办,如法Hacking吗?

大概我错了,但我的感到是犯初级毛病的不是JAVASOFT,由于JAVA使用的当地化不是在WEB使用这一层完成的,而是JVM的体系缺省编码体例依据操纵体系的情况设置(locale)改动来完成。在文章宣布在2000年岁尾,事先的LINUX对中文的locale撑持另有限,因而,在LINUX上不克不及依据locale的设置将体系缺省的编码体例酿成GB2312,从而改动JVM缺省的编码体例。
关于LINUX对l10n的撑持请看:Linux程序员必读:中文明与GB18030尺度

怎样设置可让LINUX从体系条理就撑持中文编码呢?

以是在redhat6.x下,不管你怎样设置locale,体系缺省的缺省file.encoding都是ISO_8859_1由于redhat6.2是基于glibc-2.1.x的。在redhat7.x体系内核所基于的glibc-2.2.x对l10n有了更完全的撑持,以是能够经由过程设置
LC_ALL=zh_CN.GB2312;exportLC_ALL
LANG=zh_CN.GB2312;exportLANG
让体系缺省的编码体例酿成GB2312GBK...从而改动JVM的缺省编码体例(file.encoding),以后,任何字撙节到字符流的转换,JVM城市依照体系缺省编码体例举行转换。

在基于glibc2.2以上的linux上:是能够经由过程locale的设置来改动体系缺省的编码体例,从而改动使用的缺省编码、解码体例的。

这里有2点我想申明:

1为贸易性操纵体系说句公允话:linux对国际化的撑持远远掉队于WINDOWSSOLARIS等贸易操纵体系:2年乃至更多。
2Linux是依托GNU的工具开展起来的:没有GNU就没有Linux。以是Linux对当地化的撑持,也是在中心的glibc-2.2.x对中文locale有了更好的撑持今后才慢慢开展起来的。

经由过程web.xml设置办理URLEncoder.encode()办法和体系缺省编码体例相干的成绩

据我所了解的局限内,JDK1.3中十分不切合JAVA的国际化标准的是在利用URLEncoder的时分:
好比在中文WIN98上运转的使用,利用URLEncoder.encode(Strings)时:好比“中文”这2个字间接被Encoding的话了局是"%3F%3F"=>"??"。缘故原由很复杂,“中文”在encode()过程当中必要先按GBK编码体例编码成4个BYTE后再URLEncoding才是准确的。这个在JDK1.4中也修改了。办法encode(Strings)已不勉励利用,取而代之的是除必要举行URLEncoding的字符串外,同时必要指定字符串编码体例的encode(Strings,Stringenc)。如许,URLEncoder就能够和体系缺省的编码体例有关了。

在JDK1.3下,一个基于web-app框架的使用中,这个成绩能够经由过程在WEB-INF/web.xml中设置来办理:
<web-appcharacter-encoding="your_system_default_file.encoding">
...
</web-app>


假如产物是在中文WINDOWS98运转,缺省字符集是用GBK,则这个使用的web.xml必要设置成:
<web-appcharacter-encoding="GBK">
...
</web-app>

UnicodeinsideLocaleoutsite

以上2个办法仍旧只是让使用更便利地当地化了,而使用自己并非真实的国际化使用。假想一下怎样计划一个环球的论坛体系:可让中文和日文的用户都能够便利的扫瞄宣布呢?数据应当以那种字符集存储呢?谜底很复杂:Unicode。最初,我以GOOGLE的国际言语搜刮引擎做一个计划实例申明怎样完成国际化使用的计划:GOOGLE是一个十分好的国际化使用典范(但我可没说GOOGLE是java做的哟)。

GOOGLE用户常常有如许的感到:
为何我第一次往GOOGLE,呈现的就是中文的界面?
为何在一切网站中查中文:偶然候还会出日文网站的了局?好比:"google奥密"

就以"google奥密"这个查询为例:我们在输出框输出"google奥密"
http://www.google.com/search?hl=zh-CN&newwindow=1&q=google+%C3%D8%C3%DC&btnG=Google%CB%D1%CB%F7&lr=

复杂的流程申明以下:
输出:查询(按客户端编码体例)=>GOOLGE(将输出的字撙节解码成UNICODE)=>查询UNICODE索引=>UNICODE了局集=>输入:查询了局(按客户端编码体例编码成字撙节)

详细申明:

GOOGLE怎样辨认出扫瞄器利用的“界面言语”:GOOGLE取得这个查询字符串的同时,一样平常会依据hl=zh-CN这个参数,晓得了客户端利用的字符集编码体例,假如用户第一次会见:GOOGLE会依据扫瞄器的发送的哀求中都包括的Acceptlanguage:zh_cn这个头信息来辨别,这就是为何如今良多用户第一次往GOOGLE的时分它就可以主动辨认出来的缘故原由。这个参数在以后的查询和翻页过程当中经由过程cookie保留,并经由过程get体例一向传送给GOOGLE(因而你也能够利用利用偏好设置界面言语),从而牢靠地辨认出客户真个编码体例。
GOOGLE怎样查询:大概从URL上你能够看到:传已往的“奥密”这个查询实践上是%C3%D8%C3%DC=>"奥密"这2个字按GBK(WINDOWS客户端缺省的编码体例)编码体例的4个字节URLEncode后的情势(关于中文编码体例请参考:汉字的编码体例),GOOGLE将查询字符串按这个编码体例解码并转成UNICODE,然后用这个UNICODE编码体例的字符串举行外部的查询操纵。而任何言语的页面都是先转换成UNICODE后存储在GOOGLE的数据索引库里的。在UNICODE中日文和中文写法一样的字,用的是一样的编码。因而,假如你没有指定言语过滤的话,日文网页的了局就起首被射中了;因而,关于中文客户真个查询:假如在UNICODE中映照的字一样,就能够查询到响应的日文网页,繁体中文网页...,GOOGLE的查询了局也起首是UNICODE的,最初将UNICODE了局依照客户真个编码体例转换成字撙节,前往到客户端。
从以上的剖析中我们能够看出:UNICODE实践十分大度的办理了使用的国际化成绩
1数据按能够转换成恣意字符集的UNICODE体例会合存储(Unicodeinside)
2然后依据客户真个当地化设置转换本钱地字符集(Localeoutside)

假如在此之前的使用的汉化计划相称于UCDOS和RichWin的话,这类体例早晚要被内核汉化的WIN95减少的。究竟中心级别对国际化的撑持才是一个真实的简化使用计划的通用办理计划。Microsoft和Sun的良多产物从一入手下手就是为天下市场计划的,“汉化”思绪的本源在于我们的软件开辟中满意于自力更生的小农认识。

参考文档:
Java的国际化计划
http://java.sun.com/docs/books/tutorial/i18n/index.html

Linux国际化当地化和中文明
http://www.linuxforum.net/doc/i18n-new.html

Linux程序员必读:中文明与GB18030尺度
http://www.ccidnet.com/tech/os/2001/07/31/58_2811.html

UnicodeFAQ
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://www.linuxforum.net/books/UTF-8-Unicode.html(中文版)

Java编程手艺中汉字成绩的剖析及办理
http://www-900.ibm.com/developerWorks/java/java_chinese/index.shtml

汉字的编码体例:
http://www.unihan.com.cn/cjk/ana17.htm

*正文:l10ni18n都是缩写:用的是英文单词的首位字母和其间字母个数
l10n:localization当地化
i18n:internationalization国际化
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-21 07:45:55 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
乐观 该用户已被删除
板凳
发表于 2015-1-29 15:06:25 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
小魔女 该用户已被删除
地板
发表于 2015-1-30 23:52:40 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
兰色精灵 该用户已被删除
5#
发表于 2015-2-5 18:03:23 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-13 01:51:04 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
小女巫 该用户已被删除
7#
发表于 2015-2-26 22:57:46 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
精灵巫婆 该用户已被删除
8#
发表于 2015-3-5 22:01:56 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
简单生活 该用户已被删除
9#
发表于 2015-3-11 17:41:26 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
再见西城 该用户已被删除
10#
发表于 2015-3-19 03:59:12 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
愤怒的大鸟 该用户已被删除
11#
发表于 2015-3-27 05:10:46 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 06:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表