大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> JSP/Servlet 中的汉字编码问题

JSP/Servlet 中的汉字编码问题

时间: 2021-07-31 作者:daque

JSP/Servlet 中的汉字编码问题网上就 jsp/servlet 中 dbcs 字符源代码题目有很多特出的作品和计划,正文对它们作少许整治,并贯串 ibm websphere application server 3.5(was)的处置本领作少许证明,蓄意它不是过剩的。实质: 题目的发源 ??????-80,gbk,gb18030-2000 中国字字符集及 encoding 华文转码时'?'、乱码的来由 jsp/servlet 中国字源代码题目及在 was 中的处置方法 中断语 参考作品 1. 题目的发源每个国度(或地区)都规则了计划机消息调换用的字符源代码集,如美利坚合众国的扩充 ascii码, 华夏的 ??????-80,阿曼的 jis 等,动作该国度/地区内消息处置的普通,有着一致源代码的要害效率。字符源代码集按长度分为 sbcs(单字节字符集),dbcs(双字节字符集)两大类。早期的软硬件(更加是操纵体例),为领会决当地字符消息的计划机处置,展示了百般当地化本子(l10n),为了辨别,引进了 lang, codepage 等观念。然而因为各个当地字符集代码范畴臃肿,彼此间消息调换艰巨;软硬件各个当地化本子独力保护本钱较高。所以有需要将当地化处事中的个性抽掏出来,作普遍处置,将更加的当地化处置实质贬低到最少。这也即是所谓的国际化(i18n)。百般谈话消息被进一步典型为 locale 消息。处置的底层字符集形成了简直包括了一切字形的 unicode。此刻大局部具备国际化特性的软硬件中心字符处置都是以 unicode 为普通的,在软硬件运转时按照其时的 locale/lang/codepage 树立决定相映的当地字符源代码树立,并依此处置当地字符。在处置进程中须要实行 unicode 和当地字符集的彼此变换,甚或以 unicode 为中央的两个各别当地字符集的彼此变换。这种办法在搜集情况下被进一步蔓延,任何搜集两头的字符消息也须要按照字符集的树立变换成可接收的实质。java 谈话里面是用 unicode 表白字符的,按照 unicode v2.0。java 步调不管是从/往文献体例以字符流读/写文献,仍旧往 url 贯穿写 html 消息,或从 url 贯穿读取参数值,城市有字符源代码的变换。如许做固然减少了编制程序的搀杂度,简单惹起污染,但却是适合国际化的思维的。从表面上去说,那些按照字符集树立而举行的字符变换不该当爆发太多题目。而究竟是因为运用步调的本质运转情况各别,unicode 和各个当地字符集的弥补、完备,以及体例或运用步调实行的不典型,转码时展示的题目常常搅扰着步调员和用户。 2. ??????-80,gbk,gb18030-2000 中国字字符集及 encoding本来处置 java 步调中的中国字源代码题目的本领常常很大略,但领会其背地的因为,定位题目,还须要领会现有的中国字源代码和源代码变换。??????-80 是在海内计划机中国字消息本领兴盛初始阶段拟订的,个中包括了大局部常用的一、二级中国字,和 9 区的标记。该字符集是简直一切的华文体例和国际化的软硬件都扶助的中笔墨符集,这也是最基础的中笔墨符集。其源代码范畴是上位0xa1-0xfe,低位也是 0xa1-0xfe;中国字从 0xb0a1 发端,中断于 0xf7fe;gbk 是 ??????-80 的扩充,是进取兼容的。它包括了 20902 个中国字,其源代码范畴是 0x8140-0xfefe,剔除上位 0x80 的字位。其一切字符都不妨一对一映照到 unicode 2.0,也即是说 java 本质上供给了 gbk 字符集的扶助。这是现阶段 windows 和其它少许华文操纵体例的缺省字符集,但并不是一切的国际化软硬件都扶助该字符集,发觉是她们并不实足领会 gbk 是如何回事。犯得着提防的是它不是国度规范,而不过典型。跟着 gb18030-2000国目标颁布,它将在不久的未来实行它的汗青工作。gb18030-2000(gbk2k) 在 gbk 的普通长进一步扩充了中国字,减少了藏、蒙等少量民族的字形。gbk2k 从基础上处置了字位不够,字形不及的题目。它有几个特性,它并没有决定一切的字形,不过规则了源代码范畴,留待此后夸大。 源代码是变长的,其二字节局部与 gbk 兼容;四字节局部是夸大的字形、字位,其源代码范畴是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39。 它的实行是分阶段的,开始要务实现的是不妨实足映照到 unicode 3.0 规范的一切字形。 它是国度规范,是强迫性的。 此刻还没有任何一个操纵体例或软硬件实行了 gbk2k 的扶助,这是现阶段和未来汉化的处事实质。 unicode 的引见......就免了吧。java 扶助的encoding中与华文编制程序关系的有:(有几个在jdk文书档案中未列出)ascii 7-bit, 同 ascii7 iso8859-1 8-bit, 同 8859_1,iso-8859-1,iso_8859-1,latin1... ??????-80 同??????,??????-1980,euc_cn,euccn,1381,cp1381, 1383, cp1383, iso2022cn,iso2022cn_gb...... gbk (提防巨细写),同ms936 utf8 utf-8 gb18030 (此刻惟有ibm jdk1.3.?有扶助), 同cp1392,1392 java 谈话沿用unicode处置字符. 但从另一个观点来说,在java步调中也不妨沿用非unicode的转码,要害的是保护步调进口和出口的中国字消息不走样。如实足沿用iso-8859-1来处置中国字也能到达精确的截止。搜集上时髦的很多处置本领,都属于这种典型。为了不致惹起污染,正文不对这种本领作计划。 3. 华文转码时'?'、乱码的来由两个目标变换都有大概获得缺点的截止:unicode-->byte, 即使目的代码集不生存对应的代码,则获得的截止是0x3f. 如:"\u00d6\u00ec\u00e9\u0046\u00bb\u00f9".getbytes("gbk") 的截止是 "?ìéf?ù", hex 值是3fa8aca8a6463fa8b4. 提防看一下上头的截止,你会创造\u00ec被变换为0xa8ac, \u00e9被变换为\xa8a6... 它的本质灵验位变长了!这是由于??????标记区中的少许标记被映照到少许大众的标记源代码,因为那些标记出此刻iso-8859-1或其它少许sbcs字符会合,故它们在unicode中源代码比拟靠前,有少许其灵验位惟有8位,和中国字的源代码臃肿(本来这种映照不过源代码的映照,在表露时提防不是一律的。unicode 中的标记是单字节宽,中国字中的标记是双字节宽) . 在unicode\u00a0--\u00ff 之间如许的标记有20个。领会这个特性特殊要害!由此就不难领会干什么java编制程序中,中国字源代码的缺点截止中往往会展示少许乱码(本来是标记字符), 而不全是'?'字符, 就比方上头的例子。byte-->unicode, 即使byte标识的字符在源代码集不生存,则获得的截止是0xfffd. 如:byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new string(ba,"??????"); 截止是"?啊", hex 值是"\ufffd\u554a". 0x8140 是gbk字符,按??????变换表没有对应的值,取\ufffd. (请提防:在表露该unicode时,由于没有对应的当地字符,以是也实用上一种情景,表露为一个"?".)本质编制程序中,jsp/servlet 步调获得缺点的中国字消息,常常是这两个进程的叠加,偶尔以至是两个进程叠加后重复效率的截止. 4. jsp/servlet 中国字源代码题目及在 was 中的处置方法4.1 罕见的 encoding 题目的局面网上常展示的 jsp/servlet encoding 题目普遍都表此刻 browser 或运用步调端,如: 欣赏器中看到的 jsp/servlet 页面中的中国字如何都成了 ’?’ ? 欣赏器中看到的 servlet 页面中的中国字如何都成了乱码? java 运用步调界面中的中国字如何都成了方块? jsp/servlet 页面没辙表露 gbk 中国字。 jsp 页面中内嵌在<%...%>,<%=...%>等tag包括的 java code 中的华文成了乱码,但页面包车型的士其它中国字是对的。 jsp/servlet 不许接受 form 提交的中国字。 jsp/servlet 数据库读写没辙赢得精确的实质。 湮没在那些题目反面的是百般缺点的字符变换和处置(除第3个外,是由于 java font 树立缺点惹起的)。处置一致的字符 encoding 题目,须要领会 jsp/servlet 的运转进程,查看大概展示题目的各个点。4.2 jsp/servlet web 编制程序时的 encoding 题目运转于java 运用效劳器的 jsp/servlet 为 browser 供给 html 实质,其进程如次图所示:个中有字符源代码变换的场合有:jsp 编写翻译。java 运用效劳器将按照 jvm 的 file.encoding 值读取 jsp 源文献,编写翻译天生 java 源文献,再按照 file.encoding 值写回文献体例。即使暂时体例谈话扶助 gbk,那么这功夫不会展示 encoding 题目。即使是英文的体例,如 lang 是 en_us 的 linux, aix 或 solaris,则要将 jvm 的 file.encoding 值置成 gbk 。体例谈话即使是 ??????,则按照须要,决定要不要树立 file.encoding,将 file.encoding 设为 gbk 不妨处置潜伏的 gbk 字符乱码题目java 须要被编写翻译为 .class 本领在 jvm 中实行,这个进程生存与a.同样的 file.encoding 题目。从这边发端 servlet 和 jsp 的运转就一致了,只然而 servlet 的编写翻译不是机动举行的。对于jsp步调, 对爆发的java 中央文献的编写翻译是机动举行的(在步调市直接挪用sun.tools.javac.main类). 所以即使在这一步展示题目的话, 也要查看encoding和os的谈话情况,大概将内嵌在jsp java code 中的静态中国字转为 unicode, 要么静态文本输入不要放在 java code 中。对于servlet, javac 编写翻译时细工指定-encoding 参数就不妨了。servlet 须要将 html 页面实质变换为 browser 可接收的 encoding 实质发送出去。依附于各 java app server 的实行办法,有的将查问 browser 的 accept-charset 和 accept-language 参数或以其它猜的办法决定 encoding 值,有的则尽管。所以沿用恒定encoding 大概是最佳的处置本领。对于华文网页,可在 jsp 或 servlet 中树立 contenttype="text/html; charset=??????";即使页面中有gbk字符,则树立为contenttype="text/html; charset=gbk",因为ie 和 netscape对gbk的扶助水平不一律,作这种树立时须要尝试一下。由于16位 java char在搜集传递时高8位会被抛弃,也为了保证servlet页面中的中国字(囊括内嵌的和servlet运转进程中获得的)是憧憬的内码,不妨用 printwriter out=res.getwriter() 代替 servletoutputstream out=res.getoutputstream(). printerwriter 将按照contenttype中指定的charset作变换 (contenttype需在此之前线指挥部定!); 也不妨用outputstreamwriter封装 servletoutputstream 类并用write(string)输入中国字字符串。对于 jsp,java application server 该当不妨保证在这个阶段将嵌入的中国字精确传递出去。这是证明 url 字符 encoding 题目。即使经过 get/post 办法从 browser 归来的参数值中包括中国字消息, servlet 将没辙获得精确的值。sun的 j2sdk 中,httputils.parsename 在领会参数时基础没有商量 browser 的谈话树立,而是将获得的值按 byte 办法领会。这是网上计划得最多的 encoding 题目。由于这是安排缺点,只能以 bin 办法从新领会获得的字符串;大概以 hack httputils 类的办法处置。参考作品 2 均有引见,然而最佳将个中的华文 encoding ??????、 cp1381 都改为 gbk,要不遇到 gbk 中国字时,仍旧会有题目。servlet api 2.3 供给一个新的因变量 httpserveletrequest.setcharacterencoding 用来在挪用 request.getparameter(“param_name”) 前线指挥部定运用步调蓄意的 encoding,这将无助于于完全处置这个题目。 4.3 ibm websphere application server 中的处置本领websphere application server 对规范的 servlet api 2.x 作了扩充,供给较好的多谈话扶助。运转在华文的操纵体例中,不妨不作任何树立就不妨很好地处置中国字。底下的证明不过对was是运转在英文的体例中,大概须要有gbk扶助时灵验。上述c,d情景,was 都要查问 browser 的谈话树立,在缺省情景下, zh, zh-cn 等均被映照为 java encoding cp1381(提防: cp1381 不过同等于 ?????? 的一个 codepage,没有 gbk 扶助)。如许做我想是由于没辙确认 browser 运转的操纵体例是扶助??????, 仍旧 gbk,以是取其小。然而本质的运用体例仍旧诉求页面中展示 gbk 中国字,最驰名的是朱总理名字中的“镕"(rong2 ,0xe946,\u9555),以是偶尔仍旧须要将 encoding/charset 指定于 gbk。固然 was 中变换缺省的 encoding 没有上头说的那么烦恼,对准 a,b,参考作品 5,在 application server 的吩咐行参数中指定 -dfile.encoding=gbk 即可; 对准 d,在 application server 的吩咐行参数中指定-ddefault.client.encoding=gbk。即使指定了-ddefault.client.encoding=gbk,那么c情景下不妨不复指定charset。上头列出的题目中再有一个对于tag<%...%>,<%=...%>中的 java 代码里包括的静态文本未能精确表露的题目,在was中的处置本领是除去树立精确的file.encoding, 还须要以沟通本领树立-duser.language=zh -duser.region=cn。这与java locale的树立相关。4.4 数据库读写时的 encoding 题目jsp/servlet 编制程序中常常展示 encoding 题目的另一个场合是读写数据库中的数据。时髦的联系数据库体例都扶助数据库 encoding,也即是说在创造数据库时不妨指定它本人的字符集树立,数据库的数据以指定的源代码情势保存。当运用步调考察数据时,在进口和出口处城市有 encoding 变换。对于华文数据,数据库字符源代码的树立该当保护数据的完备性. ??????,gbk,utf-8 等都是可选的数据库 encoding;也不妨采用 iso8859-1 (8-bit),那么运用步调在写数据之前须将 16bit 的一个中国字或 unicode 拆分红两个 8-bit 的字符,读数据之后则需将两个字节兼并起来,同声还要辨别个中的 sbcs 字符。没有充溢运用数据库 encoding 的效率,相反减少了编制程序的搀杂度,iso8859-1不是引荐的数据库 encoding。jsp/servlet编制程序时,不妨先用数据库处置体例供给的处置功效查看个中的华文数据能否精确。而后该当提防的是读出来的数据的 encoding,java 步调中普遍获得的是 unicode。写数据时则差异。4.5 定位题目常常用的本领定位华文encoding题目常常沿用最笨的也是最灵验的方法——在你觉得有疑惑的步调处置后打字与印刷字符串的内码。经过打字与印刷字符串的内码,你不妨创造什么功夫中笔墨符被变换成unicode,什么功夫unicode被转回华文内码,什么功夫一其中笔墨成了两个 unicode 字符,什么功夫中笔墨符串被转成了一串问号,什么功夫中笔墨符串的上位被截掉了……取用符合的样品字符串也无助于于辨别题目的典型。如:”aa啊aa丂aa” 等中英国首相间、gb、gbk特性字符均有的字符串。普遍来说,英笔墨符不管如何变换或处置,都不会走样(即使遇到了,不妨试验着减少贯串的英笔墨母长度)。5. 中断语本来 jsp/servlet 的华文encoding 并没有想像的那么搀杂,固然定位妥协决题目没有定例,百般运转情况也各不尽然,但反面的道理是一律的。领会字符集的常识是处置字符题目的普通。然而,跟着中笔墨符集的变革,不只仅是 java 编制程序,华文消息处置中的题目仍旧会生存一段功夫的。 6. 参考作品character problem review java 编制程序本领中中国字题目的领会及处置 gb18030 setting language encoding in web applications: websphere applications server

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.