??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜久久久精品电影院,亚洲无人区一区二区三区,亚洲产国偷V产偷V自拍色戒http://m.tkk7.com/xiaomage234/category/1691.html行到水穷?坐看云vӞ才发玎ͼ其实人生最重要的是扑ֈ一些吃的东西;扑ֈ一些喝的东西;扑ֈ一些可以一hW一h泪的朋友和一个懂你的人!zh-cnFri, 02 Mar 2007 02:38:54 GMTFri, 02 Mar 2007 02:38:54 GMT60(?视频聊天原理?/title><link>http://m.tkk7.com/xiaomage234/articles/6043.html</link><dc:creator>马?/dc:creator><author>马?/author><pubDate>Mon, 13 Jun 2005 08:04:00 GMT</pubDate><guid>http://m.tkk7.com/xiaomage234/articles/6043.html</guid><wfw:comment>http://m.tkk7.com/xiaomage234/comments/6043.html</wfw:comment><comments>http://m.tkk7.com/xiaomage234/articles/6043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/xiaomage234/comments/commentRss/6043.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/xiaomage234/services/trackbacks/6043.html</trackback:ping><description><![CDATA[<P><FONT size=4>视频聊天原理?摄像头的原理介绍<BR><BR>伴随着新经的发展Q互联网逐渐成ؓ了世界的dQ在短短数十q的旉里,|络变得来完善,来可爱,它拉q了ZZ间距,使我们的地球变成了一个真正的"村落"Q让更多的h体会C"w隔千里q,情系一UK"的快感?<BR><BR>  |络的发展也促进了通讯手段的变化,传统的交方式已l不能满h们的要求。从E-mai到Internet PhoneQ网l带来了通讯速度的提升,更降低了通讯成本。而随着宽带|络的普及,Z对网l通讯也有了进一步的要求。宽带网l的发展Q改变了传统|络通讯的质量和形式Q交流不再只是局限于普通语a文字Q利用视频让天各一方的朋友能够彼此相见。作为实现视频聊天的辅助工具Q除了一台配|中{的电脑外,q需要配备一?眼睛"。通过它你可以看到Ҏ的容颜,也让Ҏ一睹你的风采?<BR>   <BR>  数码相机可以作ؓ视频聊天的工P但h格昂늚它用在视频聊天上却多有些浪贏V相比,摄像头显然更适合于视频聊天用。不仅画质清晎ͼ捕捉画面速度快,而且h便宜Q售价在三、四癑օ。另外,׃一般摄像头采用USB接口Q还可以集成一些诸如拍照(|技摄像_、存储(蓝科火钻"蓝睛?Q之cȝ功能Q丰富用空间?   <BR><BR>  摄像头的原理介绍Q?<BR><BR>  现在市场上销售的摄像头都是数字摄像头Q它摄像单元和视频捕捉单元集成在一P通过微机上的USB接口Q可以实现即插即用,非常适合W记本电脑和品牌机用戗例如一些带有拍摄功能的产品。还有一些有闪盘功能的摄像头产品Q在接入电脑后还可以当作32MB的闪盘用,真正一盘两用?<BR><IMG src="http://img.zol.com.cn/article/0/752/liSethe8k7tuE.jpg" align=middle border=0> <BR>  当然Q摄像头基本的功能还是视频传输,那么它是依靠增养的原理来实现的呢Q所谓视频传输就是将囄一张张传到屏幕Q由于传输速度很快Q所以可以让大家看到q箋动态的画面Q就像放电媄一栗一般当画面的传输数量达到每U?4帧时Q画面就有了q箋性。在q行q种囄的传输时Q必d囄q行压羃Q一般压~方式有如H.261、JPEG、MPEG{,否则传输所需的带宽会变得很大。大家用RealPlayer不知是否留意Q当播放电媄的时候,在播攑֙的下方会有一个传输速度250kbps?00kbps?000kbps...画面的质量越高,q个速度也就大。而摄像头q行视频传输也是q个原理Q如果将摄像头的分L率调?40×480Q捕捉到的图片每张大约?0kb左右Q每U?0帧,那么摄像头传输视频所需的速度?0×30/sQ?500kbpsQ?.5Mbps。而在实际生活中,Z一般用于网l视频聊天时的分辨率?20×240甚至更低Q传输的帧数为每U?4帧。换a之,此时视频传输速率不?00kbpsQh们就可以q行较ؓ畅的视频传输聊天。如果采用更高的压羃视频方式Q如MPEG-1{等Q可以将传输速率降低?00kbps不到。这个就是一般视频聊天时Q摄像头所需的网l传输速度?<BR><BR>  宽带|络Q?<BR><BR>  视频压羃上已l可以满_用的标准Q但视频聊天的实玎ͼq需要互联网条g的认可。一般来_在国内我们可以通过以下几种方式上网Q?</FONT> <P> <TABLE align=center border=0> <TBODY> <TR> <TD><FONT size=4><IMG src="http://it.big5.enorth.com.cn/images/show_images_5/03060610.gif" border=0></FONT></TD></TR></TBODY></TABLE></P><FONT size=4>可以看出Q除?6K ModemQISDN以外Q一般的宽带|络都可以满用戯行视频传输的需求。而根据不同上|方式给用户提供的带宽,q可以自p节摄像头传输画面的质量,如分辨率、真彩色U别、画面捕捉传输速度{等。比如,当带宽达?MbpsӞ我们可以采用分辨率?40×480Q每U?0帧来q行视频聊天Q这时不论是画面的质量还是流畅性都是相当高的,如同两个人面寚w交流一栗?   <BR><BR>  现在Q摄像头正在向着型化、功能化的方向发展,来多的附加功能出现在摄像头品中Q例如前面提到的可以当作Ud存储使用的蓝U火?蓝睛?Q再比如雅美辄|眼昄器、罗技的摄像头数码相机{等。另外,q有一些厂商在摄像头的外型上大做文章,推出了外型设计讨巧的"丸??高达"造型摄像_深受儿童、女生的喜爱。这么多特色鲜明的品助阵,再加上网l的环境的完善,难怪摄像头会这L卖了?/FONT><img src ="http://m.tkk7.com/xiaomage234/aggbug/6043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/xiaomage234/" target="_blank">马?/a> 2005-06-13 16:04 <a href="http://m.tkk7.com/xiaomage234/articles/6043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(?JAVA里字W编码的探烦与理?/title><link>http://m.tkk7.com/xiaomage234/articles/5744.html</link><dc:creator>马?/dc:creator><author>马?/author><pubDate>Wed, 08 Jun 2005 08:49:00 GMT</pubDate><guid>http://m.tkk7.com/xiaomage234/articles/5744.html</guid><wfw:comment>http://m.tkk7.com/xiaomage234/comments/5744.html</wfw:comment><comments>http://m.tkk7.com/xiaomage234/articles/5744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/xiaomage234/comments/commentRss/5744.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/xiaomage234/services/trackbacks/5744.html</trackback:ping><description><![CDATA[<P><FONT size=4>众所周知QJAVAZ国际通用Q用的是UNICODE来保存里面的字符。而UNICODE只是一个种字符集,字符的存储和表示要用C定的字符~码格式Q而与UNICODE对应的字W编码格式就是我们常看到的UTF-8,UTF-16{等Q而UTF-8是最常用的,所以h们常常把它和UNICODE{同hQ我以前是q样的)Q这在某些情况下是没有错的,但这L理解在JAVA里就会生一些؜淆。我们用下面的程序来演示一下?BR>定义一个字W串</FONT></P> <P><FONT size=4>     String name = "?;</FONT></P> <P><FONT size=4>q个字符串就一个字W,把它取出?/FONT></P> <P><FONT size=4>     char c_name = name.charAt(0);</FONT></P> <P><FONT size=4>JAVA里的char型是十六位的Q两个字节)Q但是如果是用UTF-8的话可能会不只两位(UTF-8是变长存储的Q,那看来JAVA本nq不是用UTF-8来保存的Q口说无凭,做个实验吧?BR>    首先看看char里保存的内容</FONT></P> <P><FONT size=4>int low = (c_name) & 0xff;//取c_name的低?/FONT></P> <P><FONT size=4>int high = (c_name >> 8) & 0xff;//取c_name的高?/FONT></P> <P><FONT size=4>System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));</FONT></P> <P><FONT size=4>l果?8 02</FONT></P> <P><FONT size=4>只有两个字节而已Q?6位)Q那么真正的UTF-8~码的内Ҏ什么呢Q再看看吧?/FONT></P> <P><FONT size=4>Z方便Q我写了一个辅助方法printbyteQ作用是把一个byte数组的每个元素按照十六进制格式打印出来,同样Z方便Q我把它作ؓ静态方法?/FONT></P> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><FONT size=4><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> printbyte(</SPAN><SPAN style="COLOR: #0000ff">byte</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">[] bt)<BR><IMG id=Codehighlighter1_45_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_275_Open_Text.style.display='none'; Codehighlighter1_45_275_Closed_Image.style.display='inline'; Codehighlighter1_45_275_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_45_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_275_Closed_Text.style.display='none'; Codehighlighter1_45_275_Open_Image.style.display='inline'; Codehighlighter1_45_275_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align=top>     </SPAN><SPAN id=Codehighlighter1_45_275_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_45_275_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>         </SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000"> (</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> i </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; i </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000"> bt.length; i</SPAN><SPAN style="COLOR: #000000">++</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_101_219_Open_Image onclick="this.style.display='none'; Codehighlighter1_101_219_Open_Text.style.display='none'; Codehighlighter1_101_219_Closed_Image.style.display='inline'; Codehighlighter1_101_219_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_101_219_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_101_219_Closed_Text.style.display='none'; Codehighlighter1_101_219_Open_Image.style.display='inline'; Codehighlighter1_101_219_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>         </SPAN><SPAN id=Codehighlighter1_101_219_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_101_219_Open_Text><FONT size=4><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>              </SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> hex </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> (</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)bt[i] </SPAN><SPAN style="COLOR: #000000">&</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0xff</SPAN></FONT><FONT size=4><SPAN style="COLOR: #000000">;<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>              System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.print(Integer.toHexString(hex) </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>         }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=4><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>         System.</FONT></SPAN><FONT size=4><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">  length = </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=4>bt.length);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN></DIV></DIV> <P><FONT size=4>byte[] utf_8 = name.getBytes("utf-8");</FONT></P> <P><FONT size=4>printbyte(utf_8);</FONT></P> <P><FONT size=4>l果是e5 a0 82   length = 3</FONT></P> <P><FONT size=4>哇,三个字节Q看来JAVA内部用的真不是UTF-8Q那用的是什么呢QUTF-16Q看一下便知?/FONT></P> <P><FONT size=4>     byte[] utf_16 = name.getBytes("utf-16");</FONT></P> <P><FONT size=4>     printbyte(utf_16);</FONT></P> <P><FONT size=4>l果是fe ff 58 02   length = 4Q靠Q四个字节了。咦Q后面的?6位不正是和开始c_name的十六进制表CZL吗?看来JAVA真正的内部字W编码和UTF-16有或多或的联系。JAVA内部I竟是用的什么字W编码呢Q这个问题我也找了很久,后来在THINK IN JAVA 3rd?2章里看到一个例子出CUTF-16BEQ难道是它?</FONT></P> <P><FONT size=4>     byte[] utf_16be = name.getBytes("utf-16be");</FONT></P> <P><FONT size=4>     printbyte(utf_16be);</FONT></P> <P><FONT size=4>l果出来了:58 02   length = 2</FONT></P> <P><FONT size=4>哈哈QI got it!不多不少两个字节Q内容也一栗果然是它。同时我在里面也看到QUNICODE的编码还有一个LEQ这里的BE,LE我想应该是bigendian和littleendian吧?BR></FONT></P><img src ="http://m.tkk7.com/xiaomage234/aggbug/5744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/xiaomage234/" target="_blank">马?/a> 2005-06-08 16:49 <a href="http://m.tkk7.com/xiaomage234/articles/5744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(?struts的国际化--UTF-8~码解决http://m.tkk7.com/xiaomage234/articles/5743.html马?/dc:creator>马?/author>Wed, 08 Jun 2005 08:39:00 GMThttp://m.tkk7.com/xiaomage234/articles/5743.htmlhttp://m.tkk7.com/xiaomage234/comments/5743.htmlhttp://m.tkk7.com/xiaomage234/articles/5743.html#Feedback1http://m.tkk7.com/xiaomage234/comments/commentRss/5743.htmlhttp://m.tkk7.com/xiaomage234/services/trackbacks/5743.html本篇我们来讨Z下struts的国际化~程问题Q即所谓的i18n~程问题Q这一我们讨论其基础部分。与q个问题紧密相关的是在各java论坛中被频繁提及的中文ؕ码问题,因ؓQ英、美~程人员较少涉及C文ؕ码问题,因此Q这斚w的英文资料也是非常奇~的Q同时也很少扑ֈq方面比较完整的中文资料Q本文也试对中文ؕ码问题做一些探讨。要解决上述问题Q需要有一定的字符集方面的知识Q下面,我们先介绍字符集的有关情况Q?

一、从ASCII到UnicodeQUTF-8Q?/B>

电子计算机技术是从美国开始发展v来的Q因为美国用的文字文,国规定的计机信息交换用的字符~码集是Z熟知的扩展ASCII码,它以8bit字节为单位存储,ASCII?-31?27为控制符Q?2-126为可见字W,包括所有的英文字母Q阿拉伯数字和其他一些常见符P128-255的ASCII码则没有定义?

ASCII对英语国家是够用了,但对其他西欧国家却不够用Q因此,ZASCII扩展?-255的范_形成了ISO-8859-1字符集。值得一提的是,因ؓ考虑到程序中处理的信息大多是西文信息Q因此有些WEB容器Q如QTomcat4.xQ在处理所接收到的request字符串时Q如果您没指定request的编码方式则pȝq省地采用ISO-8859-1Q明白这一点对理解后面的问题会有帮助?

相比西方的拼x字,东方的文字(如中文)的字W数要大得多Q根本不可能在一个字节内它们表C出来,因此Q它们以两个字节为单位存储,以中文国标字W集GB2312ZQ它的第一个字节ؓ128-255。系l可以据此判断,若第一个字节大?27Q则把与该字节后紧接着的一个字节结合v来共两个字节l成一个中文字W。这U由多个字节存储一个字W的字符集叫多字节字W集QMultiByte CharsetsQ,对应的象ASCIIq种用一个字节存储一个字W的字符集叫单字节字W集QSingleByte CharsetsQ。在GB2312字符集中QASCII字符仍然用一个字节存储,换句话说该ASCII是该字符集的子集?

GB2312只包含数千个常用汉字Q往往不能满实际需要,因此Qh们对它进行扩展,q就有了我们现在q泛使用的GBK字符集,GBK是现阶段Windows及其他一些中文操作系l的~省字符集。它包含2万多个字W,除了保持和GB2312兼容外,q包含繁体中文字Q日文字W和朝鲜字符。值得注意的是GBK只是一个规范而不是国家标准,新的国家标准是GB18030-2000Q它是比GBK包含字符更多的字W集?

我国的台湑֜Z用的文字是繁体字Q其字符集是BIG5Q而日本采用的字符集则是SJIS。它们的~码Ҏ与GB2312cMQ它们的ASCII字符部分是兼容的Q但扩展部分的编码则是不兼容的,比如q几U字W集中都?中文"q两个字W,但他们在各自的字W集中的~码q不相同Q这是用GB2312写成的网는BIG5览Ӟ看到的是qp的信息的原因?

可见Q在字符集的世界里,呈现l我们的是一个群雄割据的局面,各字W集拥有一块自q地盘。这l各国和各地Z换信息带来了很大的困难,同时Q也l国际化Q本地化Q编E造成了很大的ȝ?

常言道:"分久必合"Q随着国际标准ISO10646定义的通用字符集(Universal Character Set即UCSQ的出现Qɘq种局面发生了d的改观。UCS 是所有其他字W集标准的一个超? 它保证与其他字符集是双向兼容? 是? 如果你将M文本字符串翻译到 UCS格式, 然后再翻译回原编? 你不会丢׃Q何信息。UCS 包含了用于表达所有已知语a的字W。不仅包括拉丁语、希腊语?斯拉夫语、希伯来语、阿拉伯语、亚尼亚语和乔M语的描述、还包括中文?日文和韩文这L象Ş文字?以及q_名、片假名?孟加拉语?旁遮普语果鲁I奇字符(Gurmukhi)?泰米语、印.埃纳徯(Kannada)、Malayalam、泰国语?老挝语?汉语拼音(Bopomofo)、Hangul?Devangari、Gujarati、Oriya、Telugu 以及其他CC清的语。对于还没有加入的语aQ?׃正在研究怎样在计机中最好地~码它们Q?因而最l它们都被加入?

ISO 10646 定义了一?31 位的字符集?然而, 在这巨大的编码空间中Q?q今为止只分配了?65534 个码?(0x0000 ?0xFFFD)?q个 UCS ?16位子集称?基本多语a?(Basic Multilingual Plane, BMP)?被~码?16 ?BMP 以外的字W都属于非常Ҏ的字W?比如象Ş文字)Q?且只有专家在历史和科学领域里才会用到它们?

UCS 不仅l每个字W分配一个代码, 而且赋予了一个正式的名字?表示一?UCS 值的十六q制敎ͼ 通常在前面加?"U+", p U+0041 代表字符"拉丁大写字母A"?UCS 字符 U+0000 ?U+007F ?US-ASCII(ISO 646) 是一致的Q?U+0000 ?U+00FF ?ISO 8859-1(Latin-1) 也是一致的。这里要注意的是它是?6bit为单位存储,即便对字?A"也是?6bitQ这是与前面介绍的所有字W集不同的地斏V?

历史上,在国际标准化l织研究ISO10646标准的同Ӟ另一个由多语a软g刉商l成的协会也在从事创立单一字符集的工作Q这是现在Z熟知的Unicode。幸q的是,1991q前后ISO10646和Unicode的参与者都认识刎ͼ世界上不需要两个不同的单一字符集。他们合q双方的工作成果Qƈ为创立单一~码表而协同工作。两个项目仍都存在ƈ独立地公布各自的标准Q都同意保持ISO10646和Unicode的码表兼容,q紧密地共同调整M未来的扩展。这与当q在PCZ的操作系lMS-dos与PC-dos的情形有些相象。后面,我们视ISO10646和Unicode为同一个东ѝ?

有了UnicodeQ字W集问题接近了完的解决Q但不要高兴得过早。由于历史的原因Q一些操作系l如QUnix、Linux{都是基于ASCII设计的。此外,q有一些数据库理pȝ软g如:Oracle{也是围lASCII来设计的(从其8i的白皮书上介l的讄pȝ字符集和字段的字W集中可以间接地看到q一?。在q些pȝ中直接用Unicode会导致严重的问题。用q些~码的字W串会包含一些特D的字符Q?比如 '\0' ?'/'Q?它们?文g名和其他 C 库函数参数里都有特别的含义?另外Q?大多C?ASCII 文g?UNIX 下的工具Q?如果不进行重大修Ҏ无法d 16 位的字符的?Zq些原因Q?在文件名, 文本文g, 环境变量{地方,直接使用Unicode是不合适的?

?ISO 10646-1 Annex R ?RFC 2279 里定义的 UTF-8 QUnicode Transformation Form 8-bit formQ编码没有这些问题?

UTF-8 有以下一些特性:

UCS 字符 U+0000 ?U+007F (ASCII) 被编码ؓ字节 0x00 ?0x7F (ASCII 兼容)?q意味着只包?7 ?ASCII 字符的文件在 ASCII ?UTF-8 两种~码方式下是一L?

所?>U+007F ?UCS 字符被编码ؓ一个多个字节的Ԍ 每个字节都有标记位集?因此QASCII 字节 (0x00-0x7F) 不可能作ZQ何其他字W的一部分?

表示?ASCII 字符的多字节串的W一个字节L?0xC0 ?0xFD 的范围里, q指个字W包含多个字节?多字节串的其余字节都?0x80 ?0xBF 范围里?q得重新同步非常容易, qɾ~码无国界,且很受丢失字节的媄响?

UTF-8 ~码字符理论上可以最多到 6 个字节长Q?然?16 ?BMP 字符最多只用到 3 字节ѝ?

字节 0xFE ?0xFF ?UTF-8 ~码中从未用到?

通过QUTF-8q种形式QUnicodel于可以q泛的在各种情况下用了。在讨论struts的国际化~程之前Q我们先来看看我们以前在jsp~程中是怎样处理中文问题以及我们l常遇到的:
二、中文字Wؕ码的原因及解军_?/B>

java的内核是Unicode的,也就是说Q在E序处理字符时是用Unicode来表C字W的Q但是文件和的保存方式是用字节流的。在java的基本数据类型中Qchar是Unicode的,而byte是字节,因此Q在不同的环节java要对字节和charq行转换。这U{换发生时如果字符集的~码选择不当Q就会出Cؕ码问题?

我们常见的ؕ码大致有如下几种情ŞQ?BR>1、汉字变成了问号"Q?
2、有的汉字显C正,有的则显C错?BR>3、显CZؕ码(有些是汉字但q不是你预期的)
4、读写数据库出现q

下面我们逐一对它们出现的原因做一些解释:

首先Q我们讨论汉字变成问L问题?

Java中byte与char怺转换的方法在sun.io包中。其中,byte到char的常用{换方法是Q?BR>public static ByteToCharConverter getConverter(String encoding);

Z便于大家理解Q我们先来做一个小实验Q比如,汉字"?的GBK~码?xc4e3Q其Unicode~码是\u4f60。我们的实验是这LQ先有一个页面比如名为a_gbk.jsp输入汉字"?Q提交给面b_gbk.jsp。在b_gbk.jsp文g中以某种~码方式得到"?的字节数l,再将该数l以某种~码方式转换成charQ如果得到的char值是0x4f60则{换是正确的?

a_gbk.jsp的代码如下:

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>
<table width="611" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td>&nbsp;</td>
    <td class="bigword">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td width="100">&nbsp;</td>
    <td class="bigword">Input</td>
    <td width="100">&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td class="bigword">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<table width="611" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td><form method="post" action="b_gbk.jsp">
        <table width="611" border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100" align="right"></td>
            <td><input name="ClsID" type="text" class="word" id="ClsID" maxlength="2" >
              *</td>
          </tr>
          <tr>
            <td width="100" align="right">&nbsp;</td>
            <td><input name="btn" type="submit" value="OK">
             </td>
          </tr>
        </table>
      </form></td>
  </tr>
</table>


b_gbk.jsp的代码如下:

<%@ page contentType="text/html; charset=GBK" import="sun.io.*,java.util.*" %>
<%
String a=(String)request.getParameter("ClsID");
byte b[]=a.getBytes("ISO8859-1");
for(int j=0;j<b.length;j++){
  out.println(Integer.toHexString(b[j])+"<br>");
}
ByteToCharConverter convertor=ByteToCharConverter.getConverter("GBK");
char[] c=convertor.convertAll(b);
out.println("b length:"+b.length+"<br>");
out.println("c length:"+c.length+"<br>");
for(int i=0;i<c.length;i++){
 	out.println(Integer.toHexString(c[i])+"<br>");
}
String a1=new String(a.getBytes("ISO8859-1"),"GBK");
%>
<%="a?"+a%><br>
<%="a1?"+a1%>


在浏览器中打开a_gbk.jspq输入一??字,点击OK按钮提交表单Q则会出现如?所C的l果Q?



?

从图1可以看出Q在b_gbk.jsp中这样将byte转换为char是正的Q即得到的char是\u4f60。这里要注意的是Qbyte b[]=a.getBytes("ISO8859-1");中的~码是ISO8859-1Q这是我们前面提到的有些web容器在您没有指定request的字W集时它采用缺省的ISO8859-1?

从图1中我们还看到表达?%="a?"+a%>中的aq没有正地昄"?而是变成"??"q是什么原因呢Q这里的a是作Z个String被显C的Q我们来看看我们常用的String构造函敎ͼ

String(byte[] bytes,String encoding);

在国标^CQ该函数会认为bytes是按GBK~码的,如果后一个参数省略,它也会认为是encoding是GBK?

对前一个参数就相当于将b_gbk.jsp文g的这句byte b[]=a.getBytes("ISO8859-1");中的ISO8859-1改ؓGBKQ这h然在GBK字符集中找不到相应的目的~码Q它l出的结果是0x3f?x3f。因此,׃昄???"Q这也就是造成q的第一U现象的原因。我们的例子是演C的从byte到char的{换过E,相反的过E也会造成同样的问题,限于幅Q就不在此讨ZQ大家自己可以做cM的实验来验证?

解决该问题的Ҏ是象例子中a1那样Q在获取byte数组Ӟ指定~码为ISO8859-1?

接下来,我们讨论有些汉字能正常显C,有些不能正常昄的问题?

如果我们String a1=new String(a.getBytes("ISO8859-1"),"GBK");中的GBK改ؓGB2312则象朱镕基的"?字就不能正常昄Q这是因字是GBK中的字符而在GB2312中不存在?

解决上述两种问题的方法就是象a1那样构造StringQ也是Z常说的同时也是常用的转码的方法。采用这U方法会在程序中到处出现q种语句Q特别是在Struts中,Struts有一个回写表单的功能Q在回写时也要做q种转换Q这L语句差不多要多一倍。因此,q是个比较笨拙的ҎQ有没有捷一些的Ҏ呢?其实是有的,只要在取得request的字W串前加上request.setCharacterEncoding("GBK");q句Q指定request的字W集。则<%="a?"+a%>中的ap正常昄Qa1反而不能正常显C。此时要byte b[]=a.getBytes("ISO8859-1");中的ISO8859-1变成GBKQ从byte到char的{换才是正的Q这是此时a能正常显Ca1反而不能正常显C的原因。如果此时要a1正常昄则必dString a1=new String(a.getBytes("ISO8859-1"),"GBK");中的ISO8859-1改ؓGBK?

很显Ӟ使用request.setCharacterEncoding("GBK");只能解决GBK字符问题Q要解决i18n问题则要使用UTF-8来取代GBK。我们接着做上q实验,a_gbk.jsp和b_gbk.jsp分别另存为a.jsp和b.jsp文件中的GBK改ؓUTF-8Q更改后的代码分别如下:

a.jsp代码Q?

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>

<table width="611" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td>&nbsp;</td>
    <td class="bigword">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td width="100">&nbsp;</td>
    <td class="bigword">Input</td>
    <td width="100">&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td class="bigword">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<table width="611" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td><form method="post" action="b.jsp">
        <table width="611" border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100" align="right"></td>
            <td><input name="ClsID" type="text" class="word" id="ClsID" maxlength="2" >
              *</td>
          </tr>
          <tr>
            <td width="100" align="right">&nbsp;</td>
            <td><input name="btn" type="submit" value="OK">
             </td>
          </tr>
        </table>
      </form></td>
  </tr>
</table>
b.jsp代码Q?
<ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2" 
 bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
    <td bgcolor="e6e6e6" class="code" style="font-size:9pt">
    <pre><ccid_code>  <%@ page contentType="text/html; charset=UTF-8" import="sun.io.*,java.util.*" %>

<%
request.setCharacterEncoding("UTF-8");
String a=(String)request.getParameter("ClsID");
byte b[]=a.getBytes("UTF-8");
for(int j=0;j<b.length;j++){
  out.println(Integer.toHexString(b[j])+"<br>");
}
ByteToCharConverter convertor=ByteToCharConverter.getConverter("UTF-8");
char[] c=convertor.convertAll(b);
out.println("b length:"+b.length+"<br>");
out.println("c length:"+c.length+"<br>");
for(int i=0;i<c.length;i++){
  out.println(Integer.toHexString(c[i])+"<br>");
}
String a1=new String(a.getBytes("UTF-8"),"UTF-8");
%>
<%="a?"+a%><br>
<%="a1?"+a1%>


再在a.jsp中输??字,你会发现昄l果中,一个汉字是用三个byte表示的,它们的值分别是0xe4?xbd?xa0Q也是说用UTF-8来表C汉字,每个汉字要比GBK多占用一个byteQ这也是使用UTF-8要多付出的一点代价吧?

现在Q我们讨Z下第三个问题Q即昄qQ有些莫名其妙的汉字q不是你预期的结果?

在上例中String a1=new String(a.getBytes("UTF-8"),"UTF-8");改ؓString a1=new String(a.getBytes("UTF-8"),"GBK");再输??字,则a1会显C成"?"Q您只要看一??的UTF-8码和GBK码就会知道其中的奥秘了?

下面Q我们讨Z下最后一个问题,是d数据库时出现q?

现在一些常用的数据库都支持数据库encodingQ也是说在创徏数据库时可以指定它自q字符集设|,数据库数据以指定的编码Ş式存储。当应用E序讉K数据库时Q在入口和出口处都会有encoding转换。如果,在应用程序中字符本来已变成了qQ当然也无法正地转换为数据库的字W集了。数据库的encoding可根据需要来讄Q比如要支持、繁体中文、日、韩、英语选GBKQ如果还要支持其他语a最好选UTF-8?/FONT>


]]>
(?深入剖析JSP和Servlet对中文的处理q程 http://m.tkk7.com/xiaomage234/articles/5741.html马?/dc:creator>马?/author>Wed, 08 Jun 2005 08:33:00 GMThttp://m.tkk7.com/xiaomage234/articles/5741.htmlhttp://m.tkk7.com/xiaomage234/comments/5741.htmlhttp://m.tkk7.com/xiaomage234/articles/5741.html#Feedback0http://m.tkk7.com/xiaomage234/comments/commentRss/5741.htmlhttp://m.tkk7.com/xiaomage234/services/trackbacks/5741.html阅读全文

]]>
վ֩ģ壺 ձһ| ؼëƬˬwwwѰ| þþƷӰѿ| ޾Ʒþþ| պ߹ۿƵ| ˳Ƶ| ɫҳѹۿ| ޾ƷۺϾþ| ĻƬ| þþþþþۺձ| ձѾþþþþþվ| ҹӰձŷ޾Ʒһ| 99re6Ƶ| ˳ۺվ7777㽶| ëƬ18ŮëƬ| av뾫Ʒַ| ĻӰƵ| һɫվ| ޵һƷƵ| ˻ɫվ| AVƬһ| ˳ӰԺ߹ۿ| ˽ȥŮˬƵ| ޹˾þþƷapp| ëƬ߲| þþƷѲ| avavav߲| պƵ| ƷŮͬһѲ | ձһѵӰ| aëƬѹۿվ| AVŮһ| ߳aëƬѲ| ƷƬѿ| ް߹ۿ| ˳վ߹ۿ| ߿վ| avһ | 24Сʱձ| һ| |