JSP/Servlet Öеĺº×Ö±àÂëÎÊÌâ
JSP/Servlet Öеĺº×Ö±àÂëÎÊÌâ×÷ÕߣºAdmin À´Ô´£ºASPÖÐÎÄÍø ¼ÓÈëʱ¼ä£º2004-3-28
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£¨Ë«×Ö½Ú×Ö·û¼¯£©Á½´óÀà¡£ÔçÆÚµÄÈí¼þ£¨ÓÈÆäÊDzÙ×÷ϵͳ£©£¬ÎªÁ˽â¾ö±¾µØ×Ö·ûÐÅÏ¢µÄ¼ÆËã»ú´¦Àí£¬³öÏÖÁ˸÷ÖÖ±¾µØ»¯°æ±¾£¨L10N£©£¬ÎªÁËÇø·Ö£¬Òý½øÁË LANG, Codepage µÈ¸ÅÄî¡£µ«ÊÇÓÉÓÚ¸÷¸ö±¾µØ×Ö·û¼¯´úÂë·¶Î§ÖØµþ£¬Ï໥¼äÐÅÏ¢½»»»À§ÄÑ£»Èí¼þ¸÷¸ö±¾µØ»¯°æ±¾¶ÀÁ¢Î¬»¤³É±¾½Ï¸ß¡£Òò´ËÓбØÒª½«±¾µØ»¯¹¤×÷ÖеĹ²ÐÔ³éÈ¡³öÀ´£¬×÷Ò»Ö´¦Àí£¬½«ÌرðµÄ±¾µØ»¯´¦ÀíÄÚÈݽµµÍµ½×îÉÙ¡£ÕâÒ²¾ÍÊÇËùνµÄ¹ú¼Ê»¯£¨I18N£©¡£¸÷ÖÖÓïÑÔÐÅÏ¢±»½øÒ»²½¹æ·¶Îª Locale ÐÅÏ¢¡£´¦ÀíµÄµ×²ã×Ö·û¼¯±ä³ÉÁ˼¸ºõ°üº¬ÁËËùÓÐ×ÖÐ뵀 Unicode¡£
ÏÖÔڴ󲿷־ßÓйú¼Ê»¯ÌØÕ÷µÄÈí¼þºËÐÄ×Ö·û´¦Àí¶¼ÊÇÒÔ Unicode Ϊ»ù´¡µÄ£¬ÔÚÈí¼þÔËÐÐʱ¸ù¾Ýµ±Ê±µÄ Locale/Lang/Codepage ÉèÖÃÈ·¶¨ÏàÓ¦µÄ±¾µØ×Ö·û±àÂëÉèÖ㬲¢ÒÀ´Ë´¦Àí±¾µØ×Ö·û¡£ÔÚ´¦Àí¹ý³ÌÖÐÐèҪʵÏÖ Unicode ºÍ±¾µØ×Ö·û¼¯µÄÏ໥ת»»£¬Éõ»òÒÔ Unicode ΪÖмäµÄÁ½¸ö²»Í¬±¾µØ×Ö·û¼¯µÄÏ໥ת»»¡£ÕâÖÖ·½Ê½ÔÚÍøÂç»·¾³Ï±»½øÒ»²½ÑÓÉ죬ÈκÎÍøÂçÁ½¶ËµÄ×Ö·ûÐÅÏ¢Ò²ÐèÒª¸ù¾Ý×Ö·û¼¯µÄÉèÖÃת»»³É¿É½ÓÊܵÄÄÚÈÝ¡£
Java ÓïÑÔÄÚ²¿ÊÇÓà Unicode ±íʾ×Ö·ûµÄ£¬×ñÊØ Unicode V2.0¡£Java ³ÌÐòÎÞÂÛÊÇ´Ó/ÍùÎļþϵͳÒÔ×Ö·ûÁ÷¶Á/дÎļþ£¬»¹ÊÇÍù URL Á¬½Óд HTML ÐÅÏ¢£¬»ò´Ó URL Á¬½Ó¶ÁÈ¡²ÎÊýÖµ£¬¶¼»áÓÐ×Ö·û±àÂëµÄת»»¡£ÕâÑù×öËäÈ»Ôö¼ÓÁ˱à³ÌµÄ¸´ÔÓ¶È£¬ÈÝÒ×ÒýÆð»ìÏý£¬µ«È´ÊÇ·ûºÏ¹ú¼Ê»¯µÄ˼ÏëµÄ¡£
´ÓÀíÂÛÉÏÀ´Ëµ£¬ÕâЩ¸ù¾Ý×Ö·û¼¯ÉèÖöø½øÐеÄ×Ö·ûת»»²»Ó¦¸Ã²úÉúÌ«¶àÎÊÌâ¡£¶øÊÂʵÊÇÓÉÓÚÓ¦ÓóÌÐòµÄʵ¼ÊÔËÐл·¾³²»Í¬£¬Unicode ºÍ¸÷¸ö±¾µØ×Ö·û¼¯µÄ²¹³ä¡¢ÍêÉÆ£¬ÒÔ¼°ÏµÍ³»òÓ¦ÓóÌÐòʵÏֵIJ»¹æ·¶£¬×ªÂëʱ³öÏÖµÄÎÊÌâʱʱÀ§ÈÅ×ųÌÐòÔ±ºÍÓû§¡£
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 ºÍÆäËüһЩÖÐÎIJÙ×÷ϵͳµÄȱʡ×Ö·û¼¯£¬µ«²¢²»ÊÇËùÓеĹú¼Ê»¯Èí¼þ¶¼Ö§³Ö¸Ã×Ö·û¼¯£¬¸Ð¾õÊÇËûÃDz¢²»Íêȫ֪µÀ GBK ÊÇÔõô»ØÊ¡£ÖµµÃ×¢ÒâµÄÊÇËü²»Êǹú¼Ò±ê×¼£¬¶øÖ»Êǹ淶¡£Ëæ×Å GB18030-2000¹ú±êµÄ·¢²¼£¬Ëü½«ÔÚ²»¾ÃµÄ½«À´Íê³ÉËüµÄÀúʷʹÃü¡£
GB18030-2000(GBK2K) ÔÚ GBK µÄ»ù´¡ÉϽøÒ»²½À©Õ¹Á˺º×Ö£¬Ôö¼ÓÁ˲ء¢ÃɵÈÉÙÊýÃñ×åµÄ×ÖÐΡ£GBK2K ´Ó¸ù±¾ÉϽâ¾öÁË×Öλ²»¹»£¬×ÖÐβ»×ãµÄÎÊÌâ¡£ËüÓм¸¸öÌØµã£¬
Ëü²¢Ã»ÓÐÈ·¶¨ËùÓеÄ×ÖÐΣ¬Ö»Êǹ涨Á˱àÂ뷶Χ£¬Áô´ýÒÔºóÀ©³ä¡£
±àÂëÊDZ䳤µÄ£¬Æä¶þ×Ö½Ú²¿·ÖÓë 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µÄתÂë£¬ÖØÒªµÄÊDZ£Ö¤³ÌÐòÈë¿ÚºÍ³ö¿ÚµÄºº×ÖÐÅÏ¢²»Ê§Õæ¡£ÈçÍêÈ«²ÉÓÃISO-8859-1 À´´¦Àíºº×ÖÒ²ÄÜ´ïµ½ÕýÈ·µÄ½á¹û¡£ÍøÂçÉÏÁ÷ÐеÄÐí¶à½â¾ö·½·¨£¬¶¼ÊôÓÚÕâÖÖÀàÐÍ¡£ÎªÁ˲»ÖÂÒýÆð»ìÏý£¬±¾ÎIJ»¶ÔÕâÖÖ·½·¨×÷ÌÖÂÛ¡£
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룬ºÍºº×ֵıàÂëÖØµþ(ÆäʵÕâÖÖÓ³ÉäÖ»ÊDZàÂëµÄÓ³É䣬ÔÚÏÔʾʱ×Ðϸ²»ÊÇÒ»ÑùµÄ¡£ 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 ÖеÄÖÐÎijÉÁËÂÒÂ룬µ«Ò³ÃæµÄÆäËüºº×ÖÊǶԵġ£
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 ¿ÉÒÔ½â¾öDZÔÚµÄ 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 ×÷ÁËÀ©Õ¹£¬Ìṩ½ÏºÃµÄ¶àÓïÑÔÖ§³Ö¡£ÔËÐÐÔÚÖÐÎĵIJÙ×÷ϵͳÖУ¬¿ÉÒÔ²»×÷ÈκÎÉèÖþͿÉÒԺܺõش¦Àíºº×Ö¡£ÏÂÃæµÄ˵Ã÷Ö»ÊǶÔWASÊÇÔËÐÐÔÚÓ¢ÎĵÄϵͳÖУ¬»òÕßÐèÒªÓÐGBKÖ§³ÖʱÓÐЧ¡£
ÉÏÊöc,dÇé¿ö£¬WAS ¶¼Òª²éѯ Browser µÄÓïÑÔÉèÖã¬ÔÚȱʡ״¿öÏ£¬ zh, zh-cn µÈ¾ù±»Ó³ÉäΪ JAVA encoding CP1381£¨×¢Ò⣺ CP1381 Ö»ÊǵÈͬÓÚ ?????? µÄÒ»¸ö codepage£¬Ã»ÓÐ GBK Ö§³Ö£©¡£ÕâÑù×öÎÒÏëÊÇÒòΪÎÞ·¨È·ÈÏ Browser ÔËÐеIJÙ×÷ϵͳÊÇÖ§³Ö??????, »¹ÊÇ 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ÖеĽâ¾ö·½·¨ÊdzýÁËÉèÖÃÕýÈ·µÄ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ÎÊÌâͨ³£²ÉÓÃ×µÄÒ²ÊÇ×îÓÐЧµÄ°ì·¨¨D¨DÔÚÄãÈÏΪÓÐÏÓÒɵijÌÐò´¦Àíºó´òÓ¡×Ö·û´®µÄÄÚÂ롣ͨ¹ý´òÓ¡×Ö·û´®µÄÄÚÂ룬Äã¿ÉÒÔ·¢ÏÖʲôʱºòÖÐÎÄ×Ö·û±»×ª»»³É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£¨³ö´¦£º[url]www.viphot.com£©[/url]
¸ÐлÔ×÷Õß¡£
[url]http://www.pp369.com/info/info/2415.htm[/url] °´IEºóÍ˰´Å¥Ê±ÈÃJSP²»¶Á»º´æ
ÔÚASPÀïÎÒÔø¸æËß¹ýÅóÓÑÈçºÎÈÃASP³ÌÐò²»´Ó»º´æÀï¶ÁÈ¡Êý¾Ý,ͬÑùÔÚJSPÀïÒ²ÄÜʵÏÖ£¬Çë¿´ÏÂÃæ£º
1, ʹÓÃjavaÌṩµÄ·½·¨£¬ÔÚjsp»òÕßservletÖж¼¿ÉÒÔ
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
2, ʹÓÃHTML±ê¼Ç£¬ÈçÏÂÃæ£º
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD> JSPÉú³ÉjpegͼƬÓÃÓÚͶƱ
Ò»¡¢Ç°ÑÔ
±¾ÎÄÔ×÷ÕßΪTony Wang £¬¸ÃÎÄÕÂÉæ¼°µ½ÎļþµÄ¶ÁдºÍjpgͼƬµÄ×Ô¶¯Éú³É¡£ÀûÓÃjsp+servletµÄ¼¼Êõ£¬jspµ÷ÓÃservletÉú³ÉͼƬ¡£
¶þ¡¢Ê×Îļþindex.jspÈçÏ£º
<%--
Author: Tony Wang
E-mail: [email]lucky_tony@163.net[/email]
Date: 2001-01-01
Èç¹û¶Ô³ÌÐòÓÐʲôÒÉÎÊ£¬¿ÉÒÔºÍÎÒÁªÏµ£¬ ÁíÍâ³ÌÐòÈç¹ûÓÐʲôbug£¬Âé·³Ö¸³ö£¡£¡
--%>
<%@ page contentType="text/html;charSet=gb2312"%>
<%
response.setHeader("Cache-Control","no-store");
response.setDateHeader("Expires",0);
%>
<%!
public String[] getQuestion(String s)
{
String[] strQ = new String[4];
String strTemp = null;
int i;
java.io.RandomAccessFile rf = null;
try {
rf = new java.io.RandomAccessFile(s,"r");
} catch(Exception e)
{
System.out.println(e);
System.exit(0);
}
for(i=0;i<4;i++)
{
try {
strTemp = rf.readLine();
} catch(Exception e) {
strTemp = "None Question";
}
if(strTemp==null)strTemp = "None Question";
strQ[i] = strTemp;
}
return strQ;
}
%>
<%
String s = null;
String[] question = new String[4];
s = request.getRealPath("question.txt");
question = getQuestion(s);
%>
<html>
<head>
<title></title>
<link href="css.css" rel="StyleSheet" type="text/css"></link>
</head>
<body>
<table width="180" border="1" bordercolor="#999999">
<tr>
<td align=center>±ù·«µ÷²é</td>
</tr>
<form name=frm method=post action=write.jsp>
<tr>
<td>
<%
String ss = null;
for (int i=0;i<4;i++)
{
ss = "<input type=\"radio\" name=\"choice\" value=" + i+">"+
(char)("A"+i)+"¡¢"+ question[i]+"<br>";
out.println(ss);
}
%>
</td>
</tr>
<tr>
<td align=center><input type=submit value="ÎÒ Í¶ Ò» Ʊ"></td>
</tr>
<tr>
<td align=center><img src="/vote/servlet/VoteImage" width=150 height=100></td>
</tr>
</form>
</table>
</body>
</html>
Èý¡¢Ð´Îļþwrite.jsp
<%--
Author: Tony Wang
E-mail: [email]lucky_tony@163.net[/email]
Date: 2001-01-01
Èç¹û¶Ô³ÌÐòÓÐʲôÒÉÎÊ£¬¿ÉÒÔºÍÎÒÁªÏµ£¬
ÁíÍâ³ÌÐòÈç¹ûÓÐʲôbug£¬Âé·³Ö¸³ö£¡£¡
--%>
<%!
public int[] getNumber(String s)
{
int[] mCount = new int[4];
String strTemp = null;
int i;
java.io.RandomAccessFile rf = null;
try {
rf = new java.io.RandomAccessFile(s,"r");
} catch(Exception e)
{
System.out.println(e);
System.exit(0);
}
for(i=0;i<4;i++)
{
try {
strTemp = rf.readLine();
} catch(Exception e) {
strTemp = "0";
}
if(strTemp==null)strTemp = "0";
mCount[i] = new Integer(strTemp).intValue();
}
return mCount;
}
public void setNumber(String s,int[] x)
{
try {
java.io.PrintWriter pw = new java.io.PrintWriter(new java.io.
FileOutputStream(s));
for (int i=0;i<4;i++){
pw.println(x[i]+"");
}
pw.close();
} catch(Exception e) {
System.out.println("Write file error:"+e.getMessage());
}
}
%>
<%
String tmp = null;
int choice = -1;
int[] count = new int[4];
tmp = request.getParameter("choice");
if (tmp==null){
} else {
choice = new Integer(tmp).intValue();
}
/////////////
String s = request.getRealPath("count.txt");
if(choice>=0){
count = getNumber(s);
count[choice]++;
setNumber(s,count);
}
response.sendRedirect("index.jsp");
%>
ËÄ¡¢servletÔ´úÂ룺VoteImage.java :
/*
Author: Tony Wang
E-mail: [email]lucky_tony@163.net[/email]
Date: 2001-01-01
Èç¹û¶Ô³ÌÐòÓÐʲôÒÉÎÊ£¬¿ÉÒÔºÍÎÒÁªÏµ£¬
ÁíÍâ³ÌÐòÈç¹ûÓÐʲôbug£¬Âé·³Ö¸³ö£¡£¡
*/
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
public class VoteImage extends HttpServlet
{
private String strFile = null;
private Color color[]={Color.red,Color.black,Color.orange,
Color.green};
private int baseAng = 30;
public void doGet(HttpServletRequest request,HttpServletResponse
response)
throws ServletException,IOException
{
strFile = request.getRealPath("count.txt");
float[][] xy = new float[4][2];
xy = getNumAndPercent(strFile);
int[] ang = new int[4];
ang[0] = (int)(xy[0][1]*360);
ang[1] = (int)(xy[1][1]*360);
ang[2] = (int)(xy[2][1]*360);
ang[3] = 360-ang[0]-ang[1]-ang[2];
response.setHeader("Cache-Control","no-store");
response.setDateHeader("Expires",0);
response.setContentType("image/jpeg");
ServletOutputStream out=response.getOutputStream();
BufferedImage image=new BufferedImage(150,100,BufferedImage.
TYPE_INT_RGB);
Graphics2D g=(Graphics2D)image.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.white);
g.fillRect(0,0,150,100);
AffineTransform at = null;
Arc2D arc = null;
int fromAng = baseAng;
at = AffineTransform.getRotateInstance((-20*java.lang.Math.PI)
/180,45,37);
g.setTransform(at);
int r =6;
int dx = (int)(r*java.lang.Math.cos((baseAng+ang[0])/2.0*java.
lang.Math.PI/180));
int dy = (int)(r*java.lang.Math.sin((baseAng+ang[0])/2.0*java.
lang.Math.PI/180));
arc = new Arc2D.Double(10+dx,24-dy,80,50,fromAng,ang[0],Arc2D.PIE);
g.setColor(color[0]);
g.fill(arc);
fromAng+=ang[0];
for (int i=1;i<4;i++)
{
g.setColor(color[i]);
arc = new Arc2D.Double(10,24,80,50,fromAng,ang[i],Arc2D.PIE);
g.fill(arc);
fromAng+=ang[i];
if (fromAng>360)
{
fromAng-=360;
}
}
at = AffineTransform.getRotateInstance(0,arc.getCenterX(),arc.
getCenterY());
g.setTransform(at);
for (int i=0;i<4;i++){
g.setColor(color[i]);
g.fillRect(100,15*i+20,10,10);
g.drawString((char)("A"+i)+"",120,15*i+20+8);
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
public void doPost(HttpServletRequest request,HttpServletResponse
response)
throws ServletException,IOException
{
doGet(request,response);
}
public synchronized float[][] getNumAndPercent(String sFileName)
{
float xx[][] = new float[4][2];
int totalNum = 0 ;
String strTemp = null;
int i = 0;
java.io.RandomAccessFile rf = null;
try
{
rf = new java.io.RandomAccessFile (sFileName,"r");
} catch(Exception e)
{
System.out.println(e);
System.exit(0);
}
for (i=0;i<4;i++)
{
int m=0;
try {
strTemp = rf.readLine();
} catch (Exception e){
strTemp = "0";
}
if (strTemp == null) strTemp = "0";
m = new Integer(strTemp).intValue();
xx[i][0]=m;
totalNum += m;
}
if (totalNum==0) totalNum=1;
for ( i=0;i<4;i++){
xx[i][1] = xx[i][0]/totalNum;
}
return xx;
}
}
Îå¡¢ÔÚindex.jspĿ¼Ï½¨Á¢question.txtºÍcount.txtÎļþ·Ö±ðÓÃÀ´±£´æÍ¶
ƱµÄÎÊÌâºÍͶƱµÄÊýÁ¿£¬Óû§Í¶Æ±ºó£¬¾ÍÐÞ¸Äcount.txtµÄÖµ¡£
ΪÁ˶ÔÔ×÷Õß±íʾ¸Ðл£¬Õâ2¸öÎļþÄÚÈݲ»±ä»¯£¬ÈçÏ£º
question.txt:
Yes,I think so!
No,I dont think so!
Sorry,I dont know the answer!
count.txt:
12
9
5
9
Áù¡¢Ä¿Â¼½á¹¹£º
(1)jspÎļþºÍtxtÎļþͬһ¸öĿ¼
(2).javaÎļþÊÇservletĿ¼ÏÂ
Æß¡¢²âÊÔ£º
[url]http://[server:port]/dir/index.jsp[/url]
¸ÐлÔ×÷Õß¡£
[url]http://www.devnet.cn/2004/11-9/1605046224.html[/url]
Ò³:
[1]