﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-取经-随笔分类-其他相关技术</title><link>http://www.blogjava.net/frankhou/category/5168.html</link><description>学习Java的过程犹如唐玄奘西天取经的过程，不经历各种困难是无法取得成功的。</description><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:54:58 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:54:58 GMT</pubDate><ttl>60</ttl><item><title>[转]Java字符集转换解释</title><link>http://www.blogjava.net/frankhou/archive/2005/11/23/21106.html</link><dc:creator>Frank Hou</dc:creator><author>Frank Hou</author><pubDate>Wed, 23 Nov 2005 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/frankhou/archive/2005/11/23/21106.html</guid><wfw:comment>http://www.blogjava.net/frankhou/comments/21106.html</wfw:comment><comments>http://www.blogjava.net/frankhou/archive/2005/11/23/21106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/frankhou/comments/commentRss/21106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/frankhou/services/trackbacks/21106.html</trackback:ping><description><![CDATA[<P><FONT size=2>转自：Trucy Weblog<BR><A href="http://www.trucy.org/blog/archives/eoiae/000207.html">http://www.trucy.org/blog/archives/eoiae/000207.html</A><BR><A href="http://www.trucy.org/blog/lazet/archives/000649.html">http://www.trucy.org/blog/lazet/archives/000649.html</A><BR><BR><BR>Java系统内的字符以双字节存储，采用unicode(utf-16之一)编码。（估计jdk后续版本的java字符编码可能提升为4字节，这样可彻底解决东方国家字库问题。）<BR>Utf-8是一种标准存储编码格式，用utf-8编码后的字节流具有非常好的防(纠）错和兼容能力。用utf-8编码（encode）unicode码时不会有信息损失。当然用utf-8解码（decode）utf-8编码的字节流,生成unicode码时也不会有信息损失。但禁止用utf-8解码非utf-8编码的字节流。总之Utf-8可以编码任何unicode 码，但只能解码utf-8编码的字节流。<BR>Utf-16和utf-8用法是一样的，仅是一点不同：utf-16是双字节倍数编码，utf-8是单字节倍数编码，在英文国家里用utf-8和ascii编码后的字节流是一样的，这样有利于系统平稳升级到支持utf-8的系统里，但系统要升级到支持utf-16就要把所有数据都更新一遍，这显然不能接受。注意：utf-16根据字节排序不同有两种编码</FONT></P><A name=more></A>
<P><FONT size=2>Iso8859-1是西方国家频繁使用的字符编码格式。用iso8859-1编码unicode码中的东方字库部分的字符时统统编码成??，也就是说：用iso8859-1编码unicode码时信息会有损失。但用iso8859-1解码任意（iso8859-1编码的和非iso8859-1编码的）字符流时，信息不会有损失，这是因为一个字节中的所有256个字符对iso8859-1都是合法的都是合法的。有时候在一些linux操作系统和一些应用服务器里，默认的解码方式是iso8859-1,这是大多数乱码的原因。<BR>Gb18030,gbk,gb2312是汉字字符的编码格式，用gb18030(gbk,gb2312和gb18030是同一系列，不过字库要小，但使用方式是一样的，这里不区分，统统用gb18030)编码unicode码时非中英文的字符会被编码为?,也就是说，用gb18030只能编码unicode中的中英文字符，其他的字符都会被损失掉。同样用gb18030解码只能解码gb18030编码的字符流。<BR>Xml文件中<?xml version="1.0" encoding="UTF-8" ?> 是告诉浏览器要用要用指定的编码格式解码自身这个文件，当然要求浏览器首先要支持这个编码格式（在客户端），jsp页面的字符集<%@ page contentType="text/html; charset=GBK" %>是告诉jsp服务器要用要用指定的编码格式解码自身这个jsp文件（在服务器段）. 然而在servlet程序中response.setContentType("text/html; charset=GBK");是告诉servlet程序用指定编码格式编码（在服务器段）<BR>字符集转换的基本思想很简单，用某种字符编码规则编码，就用什么编码规则解码，经常出问题的深层次原因是java对字节流未提供编码信息，可以认为这是一个严重的失误。估计未来的java能提供这样的信息。…待续<BR>涉及编码问题的地方有：java类文件编辑时，java类文件编译时，实施文件，服务器指定，jsp文件内指定，xml(html)内指定，servlet文件指定,资源连接点配置中指定.<BR>不能正常显示原因通常在两个地方：字符集；字库。对于通用的软件，一般都提供完整的字库支持。所以一般问题是解码不正确。<BR><BR><BR>续Java字符集转换解释<BR>每个软件系统内部都只使用1种字符码来表示内存中数据，如java使用unicode来表示。<BR>但由于unicode码的数据没有纠错能力，所以在用文件或数据库来存放数据时很少直接采用。<BR>utf-8及utf-16是从为unicode码提供纠错能力这个目的发展起来的。由于utf-8和过去的ascii兼容，所以utf-8成为主流用于存储unicode码的转换编码方式。utf-8及utf-16不是一种编码，仅仅是一种编码转换规则而已。<BR>gbk(gb2312,gb18030)是遵循unicode而制定的用于汉字编码的unicode码。<BR>iso8859-1是西欧文字编码。用完了一个字节的所有256个代码。<BR>在java系统里，内存中的数据必须用unicode编码，所以读取各种存储设备的数据时，都需要先根据存储设备中的数据的编码规则进行解码读取；存储数据时，需要根据存储设备要求的编码规则进行编码存储。所以在java内存中以unicode为中介，可以在各种编码规则之间来回自由转换。</FONT></P><img src ="http://www.blogjava.net/frankhou/aggbug/21106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/frankhou/" target="_blank">Frank Hou</a> 2005-11-23 11:24 <a href="http://www.blogjava.net/frankhou/archive/2005/11/23/21106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>