<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>Chen Sheng</title><link>http://chensheng.net/</link><description>chensheng.net </description><generator>RainbowSoft Studio Z-Blog 1.8 Arwen Build 81206</generator><language>zh-CN</language><copyright>Copyright 2000-2008 @ chensheng.net.(qq:99479) All Rights Reserved.浙ICP备09092413号 </copyright><pubDate>Mon, 25 Jan 2010 16:11:21 +0800</pubDate><item><title>R6034 又来了.</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/21.html</link><pubDate>Mon, 04 May 2009 20:23:55 +0800</pubDate><guid>http://chensheng.net/post/21.html</guid><description><![CDATA[<p><a class="l" target="_blank" onmousedown="return clk(0,'','','res','12','')" href="http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/9fbc9292-11b8-4ee4-94a4-5223546df280"><font color="#cc0033" size="3">R6034</font></a>,又来了.</p><p>用vs2008编译的一个项目,之前运行得很好,今天编译了一下,结果又出现了 R6034.记得之前曾发生过无数回这样诡异的事情.后来都轻松解决,这回却忘记怎么弄了.</p><p>一番折腾之后,得出如下解决之法,特记录如下</p><p>1)可以先将&quot;清单工具&quot;中的嵌入清单设成否,编译,然后再改成&quot;是&quot;,重新编译,运行试试,</p><p>2)或者干脆彻底地,把生成的清单文件删除,再重新编译,100%ok.</p><p>&nbsp;R6034 错误的解决之道--仅限于原来可以正常运行的情况下。</p><p>&nbsp;</p>]]></description><category>敲打代码</category><comments>http://chensheng.net/post/21.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=21</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=21&amp;key=3cebab53</trackback:ping></item><item><title>sqlplus 使用摘录</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/20.html</link><pubDate>Tue, 14 Apr 2009 13:23:19 +0800</pubDate><guid>http://chensheng.net/post/20.html</guid><description><![CDATA[<p>当sql语句中有&amp;(and)符号时，直接执行sql语句是不行的，如select 'a&amp;' from dual,这时在sqlplus &gt;set def off 即可</p>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/20.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=20</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=20&amp;key=e9ab2c82</trackback:ping></item><item><title>ByteArray 使用摘录 utf-16与ByteArray的恩怨 flex中文乱码之谜</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/19.html</link><pubDate>Thu, 26 Mar 2009 16:40:13 +0800</pubDate><guid>http://chensheng.net/post/19.html</guid><description><![CDATA[<p><span style="font-size: medium">ByteArray是一种有用的对象<br />他有3个值得注意的属性<br />position 及 length,endian</span></p><p><span style="font-size: medium">ByteArray 有二种操作<br />一种是Read系列，主要是将从position开始的，返回某种类型长度或指定长度的缓冲,返回结果会做根据字节顺序一些处理，同时postion会自动移到读取缓冲的终点。</span></p><p><span style="font-size: medium">二是Write系列，也是从position开始，写入某种类型长度或指定长度的数据（必要时会根据字节顺序作处理），同时position会自增。</span></p><p><span style="font-size: medium">要注意的有几点<br /><span style="font-size: large"><span><strong>1)字节顺序</strong></span></span><br />&nbsp;var b:ByteArray= new ByteArray;<br />&nbsp;b.endian=flash.utils.Endian.BIG_ENDIAN;<br />&nbsp;b.writeShort(0x1234);<br />&nbsp;b.position=0;<br />&nbsp;trace(b.readByte());//=0x12，如果b.endian=flash.utils.LITTLE_ENDIAN,则是0x34<br /><span style="font-size: large"><strong><span>2）readBytes</span></strong></span><br />ByteArray.readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void<br />Reads the number of data bytes, specified by the length parameter, from the byte stream.</span></p><p><span style="font-size: medium"><br />如<br />var b:ByteArray= new ByteArray;<br />var a:ByteArray= new ByteArray;<br />..<br />b.ReadBytes(a,o,l);</span></p><p><span style="font-size: medium">这时从b的角度来考虑，b是从b.position开始读取b的内容的。<br />从a的角度来看，a被写的数据是存放在[o,o+l)这段空间的，这时不关心a的position在何处。<br />如果a的长度原来不够，则会自动增长到o+l长度。</span></p><p><span style="font-size: large"><span><strong><span>3）writeBytes</span></strong></span></span><span style="font-size: medium"><br />public function writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void<br />var b:ByteArray= new ByteArray;<br />var a:ByteArray= new ByteArray;<br />...<br />b.writeBytes(a,o,l);<br />表示从b.postion 开始写入从a的o处开始l 长度的缓冲到b</span></p><p><span style="font-size: medium"><br /><span style="font-size: large"><span><strong>4) 关于字符集的问题</strong></span></span><br />ByteArray在处理utf-8及普通字符集都没有太大问题（通过read/writeUTF/MultiByte）<br />但在处理utf-16时有点小麻烦。<br />也就说，如果ByteArray存放的是utf-16则有些问题。</span></p><p><span style="font-size: medium">flex 自己的文档 &ldquo;Supported Character Sets&rdquo;&nbsp; 有这么一行：Unicode (Big-Endian) unicodeFFFE ，也就是说 0xFFFE flex当成大端的BOM，然而恰恰相反，这似乎应该是小端BOM吧。<br />所以当byteArray存放的是ucs-2时，即无论是大端还是小端，或者你怎么设置都不能正确得到字符串。晕啊。<br />这太郁闷了，当有BOM存在时，经过代码验证，flex是忽略ByteArray的endian设置的---只要有BOM存在(这是有道理的，因为bom决定了字节顺序）。</span></p><p><span style="font-size: medium">我写了一个小小的flex页面（页面及代码见文章最后），专门来测试，试了大把的charset 。最后的结果是让我对使用readMultiByte读取ucs-2(utf16-be or utf16-le)的缓冲不抱任何希望。</span></p><p><span style="font-size: medium">因此凡是utf-16编码的ByteArray得通过另外的方法来取得--而且有比较简单的方法（运气啊！是运气，还是因为上帝在这里关上门，就会在另一面打开一扇窗？）</span></p><p><span style="font-size: medium">ByteArray中缓冲区的数据要符合二个条件就可以读出</span></p><ol>    <li><span style="color: #0000ff"><strong><span style="font-size: medium">必须得有BOM</span></strong></span></li>    <li><span style="color: #0000ff"><strong><span style="font-size: medium">BOM之后的数据流字节顺序与BOM是一致的</span></strong></span></li></ol><p>&nbsp;</p><p><span style="font-size: medium">这样就可以通过ByteArray.toString()得到 String了！</span></p><p><span style="font-size: medium">小小代码例子：</span></p><blockquote><p><span style="font-size: medium">var s:String = &quot;123中国&quot;;<br />var b:ByteArray= new ByteArray;<br />b.writeByte(0xFF);<br />b.writeByte(0xFE);<br />b.endian=Endian.LITTLE_ENDIAN; //与上面的BOM对应起来<br />for ( var i:int = 0 ; i &lt;s.length ; ++i )<br />{<br />&nbsp;buff.writeShort( s.charCodeAt( i ));<br />}</span></p><p><span style="font-size: medium">var </span><a href="news:String"><span style="font-size: medium">news:String</span></a><span style="font-size: medium"> = b.toString();<br />trace(news);</span></p></blockquote><p><span style="font-size: medium">// or</span></p><blockquote><p><span style="font-size: medium">var s:String = &quot;123中国&quot;;<br />var b:ByteArray= new ByteArray;<br />b.writeByte(0xFE);<br />b.writeByte(0xFF);<br />b.endian=Endian.BIG_ENDIAN; //与上面的BOM对应起来<br />for ( var i:int = 0 ; i &lt;s.length ; ++i )<br />{<br />&nbsp;buff.writeShort( s.charCodeAt( i ));<br />}</span></p><p><span style="font-size: medium">var </span><a href="news:String"><span style="font-size: medium">news:String</span></a><span style="font-size: medium"> = b.toString();<br />trace(news);</span></p><p><span style="font-size: medium">&nbsp;</span></p></blockquote><p><span style="font-size: medium">我测试的flash程序所在</span></p><p><a href="http://chensheng.net/p/test-bytearray/"><span style="font-size: medium">http://chensheng.net/p/test-bytearray/</span></a></p><p><span style="font-size: medium">源代码点右键可以看到,utf-16字符串与byteArray之间的相互转换</span></p><p><span style="font-size: medium">&nbsp;</span></p><p><span style="font-size: medium">&nbsp;btw:这好象是一个bug</span></p><p><span style="font-size: medium">请参见：<a href="http://bugs.adobe.com/jira/browse/FP-716">http://bugs.adobe.com/jira/browse/FP-716</a></span></p><p><span style="font-size: medium">呵呵，这么说来，许多中文论坛上关于 Flex 中文乱码 的麻烦是有原因的，我这才是解决之首。</span></p><p>&nbsp;</p>]]></description><category>敲打代码</category><comments>http://chensheng.net/post/19.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=19</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=19&amp;key=efb67064</trackback:ping></item><item><title>病毒清除后，服务无法启动怎么办？</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/18.html</link><pubDate>Wed, 25 Mar 2009 20:37:56 +0800</pubDate><guid>http://chensheng.net/post/18.html</guid><description><![CDATA[<p>kaspersky 在我机器上发现了一个木马，倒是把木马给杀掉了--最近这几天乱装的软件太多了---又忘记开kaspersky了。同时导致我的一个服务怎么也启动不了。<br />想了好久才想到原因。记录如下：</p><p>他会同时把注册表中 某些重要的地方有这个木马文件名的注册表项也给删除掉。<br />因此，你即使将被修改过的dll恢复，也会导致一些其他的错误。</p><p>这是第二回了，上回弄了我好几天才找到原因，修复后没有作记录。<br />今天这事又发生了，只是有点印象，结果还是想了一个小时才找到解决办法。<br />故特此记录。</p><p>因此，一旦当某木马或病毒被发现并清除之后，系统如果出一些错误，如服务无法启动，则可以从这个方面着手思考。</p><p>抱怨一下：kaspersky怎么也应该把除删除文件外的一些重点操作，如删除注册表项等记录起来，或者写到一个日志文件里（或许有？我不知道？）。</p>]]></description><category>不用分类</category><comments>http://chensheng.net/post/18.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=18</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=18&amp;key=4b319425</trackback:ping></item><item><title>subversion服务器使用笔记</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/17.html</link><pubDate>Tue, 24 Mar 2009 12:40:53 +0800</pubDate><guid>http://chensheng.net/post/17.html</guid><description><![CDATA[<p><br />原来一直主要用sourcesafe，其实蛮好用的。只是这个东东天生缺陷大，要么用共享文件夹---极为不爽，要么就得用http--速度极慢，不知是不是我们项目太大---，而且还占用一个网站。<br />于是弄一个subversion 服务器，我原来都是在本机使用subversion没怎么关注用户与权限控制。<br />这里是subversion服务器安装管理笔记,btw svnbook.pdf 实在够厚，400多页，不容易读通。</p><p>要使用subversion最少需要二个软件</p><ul>    <li>TortoiseSVN&nbsp; 我最新下载的是TortoiseSVN-1.5.8.15348-win32-svn-1.5.5.msi，不过又好象出1.6了 这是客户端软件，同时还可以管理</li>    <li>服务器端我用的是CollabNetSubversion-server-1.5.6-2.win32.exe</li></ul><p>安装其实很简单：<br />首先安装CollabNetSubversion-server-1.5.6-2.win32.exe<br />1）要注意几点，你需要设置好你的svn仓库目录，如d:\data\svn_repository，端口默认3690<br />2)一般而言，你可以不安装apache，这东东对于我来说，还用不上，也不愿意用(http访问速度慢），干脆就不用装了</p><p>安装完成后，你到windows服务管理中可以找到subversion服务，启动他，你可以看到他的命令行可能如下：<br />&quot;d:\soft\CollabNetSubversionServer\svnserve.exe&quot; --service -r &quot;d:\data\svn_repository&quot; --listen-port &quot;3690&quot;</p><p>3)安装好TortoiseSVN。</p><p><b>4）下面是我的使用惯例</b></p><p>a）打开d:\data\svn_repository<br />b)建立一个目录，如&ldquo;某某项目&ldquo;，这里我们用代号&quot;project_a&quot;，当然目录可以是中文名也可以是英文名。<br />建立一个目录，如&rdquo;某工程&ldquo;，这里我们用代号&ldquo;prj_b&quot;</p><p>到目录 d:\data\svn_repository\project_a ，点右键，使用 TortoiseSVN 的&ldquo;create repository here&quot;<br />到目录 d:\data\svn_repository\某工程&nbsp; 点右键，使用 TortoiseSVN 的&ldquo;create repository here&quot;</p><p>这样我们就已经创建了二个项目</p><p>用<br />svn://localhost/project_a （或svn://ip地址/project_a）及 svn://localhost/某工程 你就会发现已经有二个svn可以管理的仓库了。<br />当然你可以试一个 svn://localhost/ 你就会发现提示&ldquo;No repository found in ...&quot;</p><p><br />c)在目录d:\data\svn_repository 创建一个passwd<br />内容为<br />[users]<br />usera=passwd-a<br />userb=passwd-b<br />d)在目录d:\data\svn_repository创建文件：svnserve.conf<br />内容为</p><p>[general]<br />anon-access =none <br />auth-access = write<br />password-db = ../../passwd<br />authz-db = authz</p><p>并将其分别复制到<br />d:\data\svn_repository\某工程\conf 及d:\data\svn_repository\project_a\conf 目录（覆盖文件）</p><p>e)修改d:\data\svn_repository\project_a\conf\authz 文件<br />内容<br />[/]<br />usera=rw<br />*=<br />f)修改d:\data\svn_repository\某工程\conf\authz 文件<br />内容<br />[/]<br />userb=rw<br />*=</p><p>这样你就会发现<br />usera只能读写 project_a<br />而userb只能读写&quot;某工程&ldquo;</p><p><b>总结：</b><br />这样做的目的<br />1）必须要有密码与用户名才可以读写<br />2）所有项目的用户与密码都由同一个文件管理<br />3）不同的项目及目录都可以设置不同的用户及相应的权限</p>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/17.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=17</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=17&amp;key=bb3e9a62</trackback:ping></item><item><title>利用centos 安装文件(iso)升级到新版本</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/update_centos_4_4_to_4_6.html</link><pubDate>Mon, 12 May 2008 14:03:30 +0800</pubDate><guid>http://chensheng.net/post/update_centos_4_4_to_4_6.html</guid><description><![CDATA[<p>利用CentOS的DVD安装文件本地更新现有的Centos，速度非常快。</p><p>1 将CentOS-4.6-x86_64-binDVD.iso 下载到一个目录<br />(因为有多台机器需要升级，可以采用nfs)<br />2 mkdir /mnt/iso<br />3 mount -t iso9660 -o loop CentOS-4.6-x86_64-binDVD.iso /mnt/iso<br />4 修改/etc/yum.repos.d/CentOS-Base.repo<br />将所有mirrorlist改成baseurl=file:///mnt/iso/<br />5 将gpgcheck=1 改成gpgcheck=0<br />6 yum remove srptools<br />(上面那步解决：Error: Missing Dependency: kernel-ib is needed by package srptools）<br />7 yum upgrade</p><p><br />8 一路选择yes<br />9 最后# cat /etc/redhat-release<br />&gt;CentOS release 4.6 (Final)<br />&nbsp;</p><p>初步升级完成</p><p>&nbsp;</p>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/update_centos_4_4_to_4_6.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=16</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=16&amp;key=246a8ffd</trackback:ping></item><item><title>SQLite的原子提交原理</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/15.html</link><pubDate>Tue, 29 Jan 2008 13:04:11 +0800</pubDate><guid>http://chensheng.net/post/15.html</guid><description><![CDATA[<p>本文描述了</p><p>详情参见：<a href="http://chensheng.net/p/sqlite/auto_commit_zh_cn.html">SQLite的原子提交原理</a></p><p>&nbsp;</p>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/15.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=15</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=15&amp;key=f8c48ae2</trackback:ping></item><item><title>字符集拾遗</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/12.html</link><pubDate>Wed, 15 Aug 2007 22:34:26 +0800</pubDate><guid>http://chensheng.net/post/12.html</guid><description><![CDATA[<strong><h3><strong><span style="FONT-WEIGHT: bold"><strong>DBCS</strong> 是双字符集</span></strong></h3><p>&nbsp;它兼容ascii。也就是说，在DBCS中，ANSI所表示的字符是一样的。这就是说DBCS并不总是用双字符，只是在需要的时候，最多用双字符来表示。DBCS是一种统称，一种泛指。具体来说，<font size="2">Shift-JIS,</font>gb2312,big5,gbk,gb18030等等都是dbcs的一种具体实现方案。</p><p>GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE</p><p>　GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符</p><p>2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030，对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。</p><p>从ASCII、GB2312、GBK到GB18030，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编码中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。</p><p>&nbsp;</p><p>&nbsp;</p><p>这里还有一些细节：</p><ul>    <li>GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。 </li>    <li>在DBCS中，GB内码的存储格式始终是大端字节顺序（即网络节顺序），即高位在前。 </li>    <li><font size="2">GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。</font></li></ul><h3>那么又什么是<strong>区位码</strong>？</h3><p>区位码，即是区码与位码。</p><p>我国国家标准局于1981年5月颁布了《信息交换用汉字编码字符集&mdash;&mdash;基本集》，代号为GB2312-80，共对6763个汉字和682个图形字符进行了编码，其编码原则为：汉字用两个字节表示，每个字节用七位码（高位为0），;国家标准将汉字和图形符号排列在一个94行94列的二维代码表中，;每两个字节分别用两位十进制编码，前字节的编码称为区码，后字节的编码称为位码，此即区位码，;如&ldquo;保&rdquo;字在二维代码表中处于17区第3位，区位码即为&ldquo;1703 &rdquo;。 </p><p>&nbsp;</p><h3>国标码</h3><p>国标码是汉字信息交换的标准编码.是指我国1981年公布的&ldquo;中华人民共和国<nobr>国家标准</nobr>信息交换汉字编码&rdquo;，代号为&ldquo;GB2312-80&rdquo;。由连续的两个字节组成。</p><p>国标码：并不等于区位码，它是由区位码稍作转换得到,其转换方法为：先将十进制区码和位码转换为十六进制的区码和位码，;这样就得了一个与国标码有一个相对位置差的代码，;再将这个代码的第一个字节和第二个字节分别加上20H，就得到国标码。如：&ldquo;保&rdquo;字的国标码为3123H，它是经过下面的转换得到的：1703D－&gt;1103H-&gt;+20H－&gt;3123H。</p><p>国标码很少直接使用。</p><p>那上面的所谓内码又是什么呢？其实就是gb2312编码时存储表示汉字的代码。从区位码到内码，需要在高字节和低字节上分别加上A0。</p><p>国标码是汉字信息交换的标准编码，但因其前后字节的最高位为0，与ASCII码发生冲突，如&ldquo;保&rdquo;字，国标码为31H和23H（区位码为0x1103)，而西文字符&ldquo;1&rdquo;和&ldquo;#&rdquo;的SCII也为31H和23H，现假如内存中有两个字节为31H和23H，;这到底是一个汉字，还是两个西文字符&ldquo;1&rdquo;;和&ldquo;#&rdquo;?于是就出现了二义性，显然，国标码是不可能在计算机内部直接采用的，于是，;汉字的机内码采用变形国标码，其变换方法为：将国标码的每个字节都加上128(0xA0)，即将两个字节的最高位由0改1，其余7位不变，如：由上面我们知道，&ldquo;保&rdquo;字的国标码为3123H，前字节为00110001B，后字节为00100011B，高位改1为10110001B和10100011B 即为B1A3H，因此，字的机内码就是B1A3H。<br /></p><h3>MBCS 又是什么呢？</h3><p>MBCS=多字节字符集。所以DBCS(双字节字符集)又说回来是MBCS的一种实现策略。DBCS似乎是MBCS的主要实现（因为中文，日文等是主要需求这MBCS），所以可以简单的认为MBCS一般就是DBCS好了。</p><p>为了完整起见，再说一下SBCS（即单字符集）。ASCII码就是单字符集，没办法来表示更多字符。</p><p><blockquote><div class="quote"></p><ul>    <li>mbcs=1个文字由多个字节表现的文字的集合。同时，指在其文字中分配的字符编码的体系。 </li>    <li>像日语和中文等文字组/编码一样地，把以2个字节表现1个字的文字组和编码体系特别地称为DBCS(Double Byte Character Set)。 </li>    <li>把拉丁字母和数字&middot;记号的ASCII等，以一个字节表现1个字的文字组和编码体系的叫做SBCS(Single Byte Character Set)。</li></ul><p></div></blockquote></p><p>MBCS(DBCS)主要是一种unicode的一种替换</p><h3>那什么又是unicode?</h3><p>unicode是一件大工程。</p><p><font size="2">Unicode也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是&quot;Universal Multiple-Octet Coded Character Set&quot;，简称为UCS。UCS可以看作是&quot;Unicode Character Set&quot;的缩写。</font></p><p><font size="2">前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如&ldquo;汉&rdquo;字的Unicode编码是6C49，而GB码是BABA。</font></p><p><font size="2"></font></p><p>Unicode 具体不多说了，一般有有ucs与utf之说。</p><p><font size="2">UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码，是由UTF(UCS Transformation Format)规范规定的，常见的UTF规范包括UTF-8、UTF-7、UTF-16。</font></p><font size="2"><h3><font size="2">ucs与utf是unicode的二个方面。</font></h3></font><p>而ucs分成ucs-2与ucs-4。基本上在现实应用中，可以忽略ucs-4（基本上没有软件使用它）</p><p><font size="2">UCS有两种格式：UCS-2和UCS-4。顾名思义，UCS-2就是用两个字节编码，UCS-4就是用4个字节（实际上只用了31位，最高位必须为0）编码。</font></p><p><font size="2">UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下：</font></p><p>&nbsp;</p><table width="75%" border="1">    <tbody>        <tr>            <td><font size="2">UCS-2编码(16进制)</font></td>            <td><font size="2">UTF-8 字节流(二进制)</font></td>        </tr>        <tr>            <td><font size="2">0000 - 007F</font></td>            <td><font size="2">0xxxxxxx</font></td>        </tr>        <tr>            <td><font size="2">0080 - 07FF</font></td>            <td><font size="2">110xxxxx 10xxxxxx</font></td>        </tr>        <tr>            <td><font size="2">0800 - FFFF</font></td>            <td><font size="2">1110xxxx 10xxxxxx 10xxxxxx</font></td>        </tr>    </tbody></table><p>&nbsp;</p><p><font size="2">例如&ldquo;汉&rdquo;字的Unicode编码是6C49。6C49在0800-FFFF之间，所以肯定要用3字节模板了：<font color="#0000ff">1110</font>xxxx <font color="#0000ff">10</font>xxxxxx <font color="#0000ff">10</font>xxxxxx。将6C49写成二进制是：0110 110001 001001， 用这个比特流依次代替模板中的x，得到：<font color="#0000ff">1110</font>0110 <font color="#0000ff">10</font>110001 <font color="#0000ff">10</font>001001，即E6 B1 89。</font></p><p><font size="2">读者可以用记事本测试一下我们的编码是否正确。</font></p><p><font size="2">UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码，UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码，定义了一个算法。不过由于实际使用的UCS2，或者UCS4的BMP必然小于0x10000，所以就目前而言，可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案，UTF-16却要用于实际的传输，所以就不得不考虑字节序的问题。</font></p><h3>UTF的字节序和BOM</h3><p><font size="2">UTF-8以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如收到一个&ldquo;奎&rdquo;的Unicode编码是594E，&ldquo;乙&rdquo;的Unicode编码是4E59。如果我们收到UTF-16字节流&ldquo;594E&rdquo;，那么这是&ldquo;奎&rdquo;还是&ldquo;乙&rdquo;？</font></p><p><font size="2">Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是&ldquo;Bill Of Material&rdquo;的BOM表，而是Byte Order Mark。BOM是一个有点小聪明的想法：</font></p><p><font size="2">在UCS编码中有一个叫做&quot;ZERO WIDTH NO-BREAK SPACE&quot;的字符，它的编码是FEFF。而FFFE在UCS中是不存在的字符，所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前，先传输字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;。</font></p><p><font size="2">这样如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。因此字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;又被称作BOM。</font></p><p><font size="2">UTF-8不需要BOM来表明字节顺序，但可以用BOM来表明编码方式。字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;的UTF-8编码是EF BB BF（读者可以用我们前面介绍的编码方法验证一下）。所以如果接收者收到以EF BB BF开头的字节流，就知道这是UTF-8编码了。</font></p><p>&nbsp;实际在我们用vc编写程序的时候，unicode就基本是用ucs。</p><p>&nbsp;</p><div class="posthead">　UTF-7</div><div class="postbody"><p>　　MIME(Multipurpose Internet Mail Extensions) 中没有将 Unicode 定义为一种许可的字符集，也没有规定其如何编码。虽然已有其他的一些编码格式（如：UTF-8）应用于邮件当中，但它们使用了128到255之间的数值去表示 Unicode 字符，这对于非 US-ASCII 的字符集的编解码是不利的。 <br />　　因为很多邮件网关和系统无法正确地提交八位的 US-ASCII 码，这样使用扩展的 US-ASCII 的字符将出现丢失位(bit)的情况。由于 UTF-7 只使用 7 位(bit)，最高位不使用，因此 UTF-7 编码能够完整的在这些系统中进行传输。 <br />　　对于部分US-ASCII 字符和 US-ASCII 以外的字符，UTF-7 采用变字节顺序的方法进行解码，并使用 US-ASCII 中的保留字符作为转换字符(shift character)。以下是 UTF-7 编码和解码规则的说明。 </p><p>　　UTF-7 将 Unicode 字符分为三种进行处理： </p><ol>    <li>直接进行编码的字符，即直接使用 US-ASCII 作为编码的字符。这类字符包括大小写字母、数字字符、以及下列字符。（注意不包含字符 + ） <br />    <span style="COLOR: #008000">'&nbsp; (&nbsp; )&nbsp; ,&nbsp; -&nbsp; .&nbsp; /&nbsp; :&nbsp; ? 。</span> </li>    <li>可选择的直接进行编码的字符。（注意不包含字符 \ 和字符 ~）&nbsp; <br />    &nbsp;<span style="COLOR: #008000">! &quot; # $ % &amp; * ; &lt; = &gt; @ [ ] ^ _ ' { | }</span> </li>    <li>除1、2两种字符以外的 Unicode字符。 </li></ol><p>&nbsp;</p><p><strong>&nbsp;UTF-7 的编码规则</strong> </p><p>&nbsp;</p><ol>    <li>(direct encoding) 对于第一类字符，直接使用 US-ASCII 进行编码，对于第二类字符，则可选择的使用 US-ASCII 或变字节顺序的方法进行编码。但要注意，在邮件头中，若直接对第二类字符使用 US-ASCII 进行编码，可能会出现某些网关无法正确读取的现象。 </li>    <li>(Unicode shifted encoding) 除字符 &quot;+&quot; 和第一、二类两种字符以外字符需采用变字节顺序的方法进行解码，使用符号 &quot;+&quot; 控制编码过程的开始，直到遇到回车，换行字符或文末则结束，并使用 &quot;-&quot; 控制编码过程的结束。在 &quot;+&quot; 与 &quot;-&quot; 的编码采用修正的 Base64 编码表示。 <br />    <em>例如：</em> 字符串&quot;A&ne;&Alpha;&quot;(Unicode: 0041 2260 0391)的编码为：A+ImADkQ-(ASCII: 41 2B 49 6D 41 44 6B 51 2D) </li>    <li>特殊字符 &quot;+&quot; 的编码为2B2D(H)。当出现着编码为2B2D(H)，即&quot;+-&quot;的特殊情况时，直接则认定 2D(H) 无效，并予以忽略。因此2B2D(H)编码，解码得到的字符串为&quot;+&quot;，而不是&quot;+-&quot;。对于编码2B2D2D(H)，解码得到的字符串才是&quot;+-&quot;。 </li>    <li>空格(dec 32), 跳格(dec 9), 回车(dec 13)和换行(dec 10)，直接使用 US-ASCII 进行编码。 </li></ol></div></strong>]]></description><category>不用分类</category><comments>http://chensheng.net/post/12.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=12</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=12&amp;key=108c9a3c</trackback:ping></item><item><title>linux 与 磁盘阵列 折腾笔记</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/11.html</link><pubDate>Tue, 31 Jul 2007 12:27:33 +0800</pubDate><guid>http://chensheng.net/post/11.html</guid><description><![CDATA[<p>上周数据导了12小时.</p><p>上上周一直在折腾一个旧磁盘阵列.</p><p>在RedHat AS4.0 上面倒是轻松就可以找到这个阵列.只是开始的时候出了点麻烦.</p><p>我为这个阵列的每个通道都映射了二个分区.折腾许久之后,发现安装的Linux只认识一个分区.</p><p>打电话问磁盘阵列厂家的技术人员,没有什么结果,显然,他没遇上这样的事情.</p><p>最后自己找到了解决办法:</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>然后reboot就ok了.</p><p>&nbsp;</p><p>最后用: fdisk -l</p><p>Disk /dev/sda: 1689.5 GB, 1689549537280 bytes<br />Disk /dev/sdb: 1830.3 GB, 1830348128256 bytes<br />Disk /dev/sdc: 1689.5 GB, 1689549537280 bytes<br />Disk /dev/sdd: 1830.3 GB, 1830348128256 bytes</p><p><br />显然 sda与sdc是重复的,sdb与sdd 是重复的.这我不知道如何处理了,在windows 2003中也显示有四个磁盘.不管他了.</p><p>最后在我把这个东东折腾好之后,竟然在redhat的网站上找到了相关资料,晕.谁让我对linux投入太少.顺便把url记一</p><p>&nbsp;如何使红帽企业Linux4支持多LUN?</p><p><a href="http://www.redhat.com.cn/kbase/5583.php">http://www.redhat.com.cn/kbase/5583.php</a></p><p>&nbsp;</p><p>最后要讲一下的是我折腾XManager的事情.其实把Xmanager用起来不麻烦.麻烦的是我在.bash_profile</p><p>设置了 DISPLAY=a.b.c.d:0</p><p>这一个设置害得我花了太多时间,对于XManager来说,完全是画蛇添足.</p><p>&nbsp;</p><p>&nbsp;</p><p>1.[root@hot158 ~]# uname -a</p><p>&nbsp;</p><p>Linux hot158 2.6.9-42.ELsmp #1 SMP Tue Aug 15 10:35:26 BST 2006 x86_64 x86_64 x86_64 GNU/Linux</p><p>2.[root@hot158 ~]# cp /boot/initrd-2.6.9-42.ELsmp.img /boot/initrd-2.6.9-42.ELsmp.old</p><p>3.添加以下内容到/etc/modprobe.conf</p><p>options scsi_mod max_luns=xxx</p><p>(xxx是scsi_mod需要支持LUN的数目，如255)</p><p>4. 为了使修改有效，创建启动内存磁盘</p><p>mkinitrd -f /boot/initrd-2.6.9-42.ELsmp.img&nbsp; 2.6.9-42.ELsmp</p><p>&nbsp;</p><p>&nbsp;-=========================</p><p>Xmanager:<br /><font size="2">1. /etc/X11/xdm/Xaccess 文件，去掉这行的注释。 <br /># * #any host can get a login windows&quot; <br />2. </font></p><p>#vi /etc/X11/xdm/xdm-config</p><p>在最后一行： DisplayManager.requestPort: 0 前面加！号注释掉此行。</p><p>#vi /etc/X11/xdm/Xservers</p><p>在最后一行：:0 local /usr/X11R6/bin/X 前面加#号注释掉这一行。 <br />3. /etc/X11/gdm/gdm.conf文件，<br />[xdmcp]部分，把enable 改为 true <br />4. /etc/kde/kdm/kdmrc文件，<br />[Xdmcp]部分，把enable 改为 true <br />5. /etc/inittab 修改运行级别为5 (X11) ，如果为3的话，你看到的将不是桌面，而是命令行窗口。 <br />6. 防火墙 增加177端口<br />7. reboot</p><p><font size="2">如果想要每次启动自动启动xdm，那么请在/etc/rc.d/rc.local文件尾部加入/etc/X11R6/bin/xdm </font></p>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/11.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=11</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=11&amp;key=50ad3440</trackback:ping></item><item><title>oracle 位操作函数</title><author>crazycs@163.com (cs)</author><link>http://chensheng.net/post/8.html</link><pubDate>Mon, 18 Jun 2007 11:25:43 +0800</pubDate><guid>http://chensheng.net/post/8.html</guid><description><![CDATA[<p>其实位操作对于oracle数据类型来说,有些格格不入.故oracle本来就没有提供位操作符.</p><span class="Code"><br/><p>create function bitor(p_dec1 number, p_dec2 number) return number is<br />begin<br />&nbsp; return p_dec1-bitand(p_dec1,p_dec2)+p_dec2;<br />end;</p><p>&nbsp;</p><p><br /><span style="FONT-WEIGHT: bold"><em>create function bitxor(p_dec1 number, p_dec2 number) return number is<br />begin<br />&nbsp; return bitor(p_dec1,p_dec2)-bitand(p_dec1,p_dec2);<br />&nbsp; -- or you could use: return p_dec1-2*bitand(p_dec1,p_dec2)+p_dec2;<br />end;</em></span><br/></p><p><span style="FONT-WEIGHT: bold"></span>&nbsp;</p></span><br/><span><br /></span>]]></description><category>数据库与项目应用</category><comments>http://chensheng.net/post/8.html#comment</comments><wfw:comment>http://chensheng.net/</wfw:comment><wfw:commentRss>http://chensheng.net/feed.asp?cmt=8</wfw:commentRss><trackback:ping>http://chensheng.net/cmd.asp?act=tb&amp;id=8&amp;key=8ef6d867</trackback:ping></item></channel></rss>
