|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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我觉得最应该避免的就是:只学习,不思考,只记忆,不实践! |
|