??xml version="1.0" encoding="utf-8" standalone="yes"?>
UTF (Unicode/UCS Transformation Format),Unicode推荐使用UTF-8和UTF-16两种格式其中8?6指的是Bits数而不是Bytes数?br />UTF-16基本是Unicode双字节的实现Q加上一个应付未来需要的扩充~码机制Q很用Q?br />UTF-8 是一U不{幅的编码方式,英数字(Ascii字码Q保持原Ӟ完全不受影响Q因此不需要做转换Q,而其他汉字资料须透过E序来{换,会[变胖]Q因为每个字需要额外一个或两个Bytes来编码?br />UCS字符集中Q有UCS-2和UCS-4{编码方式其中的2?指的是bytes敎ͼ对应UTF-8和UTF-16.
UCS-2基本和Unicode双byte ~码差不?br />UCS-4?byte~码表示一个字Q在每个 UCS-2前面加上两个I白的ByteQ便可得到对应的 UCS-4?br />
Unicode的空间分配:
以下UnicodeZ码均?6q制表示
Unicode的前256个字W和ISO-8859-1(西欧字母)完全相同Q其中前半段是Ascii(u+0000到u+00FF)。每个ISO-8859-1码前面补上一个空byte(0x00)后才是相应的Unicode码?br />和我们切w相关的Unihan主要分布在u+3400到u+F9FFF之间QGB2312和BIG5主要分布在u+4E00到U+9FFF之间?br />
UTF-8的编码原理和Ҏ:
知道了西Ƨ字W和汉字在Unicode中的位置后,来看看UTF-8
U+0000~U+007E 1 _ _ _ _ _ _ _ (7bits)
U+0080~U+07FF 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)
U+0800~U+FFFF 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits)
看一看Unicode三种格式提出自由的bitsQ下划线IZQ是否以用来代表区位中各Unicode码,刚好够用?br />那么当程序处理UTF-8~码文gӞ如何得知一个字W的疆界落在哪里Q还有到底他是以三种形式那一中出现呢Q?br />每个以UTF-8~码的字W,不管是以一、二、三个bytes出现Q第一个byte前端都清楚地标示了该字符的byteL。如110U有两个1Q代表这U字W是以第二种方式出现Q由两个bytesl成。?110有三?Q表CU字W一点种方式出现Q由三个字节l成?br />每个多重byte的UTF-8~码有一个共同的通性,卛_中的W二个第三个byte, 一律以10两个bits开头。由于其中的最高位总设?Q可以很Ҏ和那些在UTF-8中只用一个Byte的ASCII字元区分开来,方便侦错?br />因ؓ上述设计特点QUTF-8和Unicode之间Q可以很Ҏ做双向自p{换,而不会丢׃Q何资料?/font>
解决办法Qؕ码问题在 NT操作pȝ我没怎么到q,但是在UNIX 或LINUXpȝ上出现的比较?br />׃操作pȝ和用环境不一P产生q的方式也不一P但是如果掌握了上面的Unicode ~码原理Q自׃l分析一下,很多问题便可q刃而解?br />下面看看几个常见的例子?br />1Q?如果一些网站服务器例如Tomcat 如果遇到中文q问题Q可以修改conf目录下的server.xml
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
URIENcoding 设成GBK或GB2312
2Q?表单中或传递字W串Q本来输入的汉字是正常的Q但是提交后再显C出来是qQ因为提交的一般是 ISO8859~码Q所以显C的时候要转成GB2312~码Q?br />
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//rs为待转换的字W串
然后使用S字符串的值就可以?br />3Q?有的服务器端的语a环境如果设成体中文的也可以解xc问?br />4Q?插入数据库中的字W是q
看看数据库中支持的是何种~码方式Q用cM2中的方式作一下{换即可?br />5Q?MQ用jsp开发,到qQ你得分析是ȝ时候发生ؕ码,q是写的时候发生ؕ码,?中的转换Q基本就能解决问题,有些时候写的时候做一ơ{换,例如Q?br />String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//ȝ时候在转换回来
String S=new String(rs.getString("news").getBytes("ISO8859_1"),"GB2312");
或者把ISO8859-1和GB2312 的位|换一下,自己多试试,p扑ֈ解决问题的办法?/span>
来自Q?a >http://blog.csdn.net/softj/archive/2006/03/15/625193.aspx