<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wupei&#039;s Blog</title>
	<atom:link href="http://wupei.j2megame.org/feed" rel="self" type="application/rss+xml" />
	<link>http://wupei.j2megame.org</link>
	<description>about Programming Technology</description>
	<lastBuildDate>Fri, 02 Sep 2011 05:42:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>香港电台主持人梁继璋送给儿子的备忘录</title>
		<link>http://wupei.j2megame.org/archives/134</link>
		<comments>http://wupei.j2megame.org/archives/134#comments</comments>
		<pubDate>Fri, 02 Sep 2011 05:38:53 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
				<category><![CDATA[经典转载]]></category>

		<guid isPermaLink="false">http://wupei.j2megame.org/?p=134</guid>
		<description><![CDATA[我儿： 写这备忘录给你，基于三个原则： （一）人生福祸无常，谁也不知可以活多久。有些事情还是早一点说好。 （二）我是你的父亲，我不跟你说没有人会跟你说。 （三）这备忘录里记载的，都是我经过惨痛失败得回来的体验，可以为你的成长省走不少冤枉路。 以下，便是你在人生之中好好记住的是： （一）对你不好的人，你不要太介怀，在你一生中，没有人有义务要对你好，除了我和你妈妈。至于那些对你好的人，你除了要珍惜，感恩外，也请多防备一点，因为，每个人做每件事总有一个原因，他对你好，未必真的是因为喜欢你，请你必须搞清楚，而不必太快将对方看作真朋友。 （二）没有人是不可代替的，没有东西是必须拥有的。看透了这一点。将来你身边的人不再要你，或许失去了世间上最可爱的一切时，也应该明白，这并不是什么大不了不得的事。 （三）生命是短暂的，今日你还在浪费着生命，明日会发觉生命已远离你了。因此，愈早珍惜生命，你享受生命的日子也愈多，与其盼望长寿，倒不如早点享受。 （四）世界上并没有最爱这回事，爱情只是一种霎时的感觉而这感觉绝对会随时间，心境而改变。如果你所谓最爱的离开了你，请耐心的等一下，让时日慢慢冲洗，让心灵慢慢沉淀，你的苦就会慢慢淡化。不要过分憧憬爱情的美，不要过分夸大失恋的悲。 （五）虽然，很多有成就的人士都没受过很多教育，但并不等于不用功读书，就一定能成功。你学到的知识，就是你应有的武器。人，可以白手起家，但不可以手无寸铁，谨记。 （六）我不会要求你供养我下半辈子，同样的我也不会供养你的下半辈子，当你长大到可以独立的时候，我的责任已经完结。以后，你要做巴士还是benz，吃鱼翅还是粉丝，都要自己负责。 （七）你可以要求自己守信，但不能要求别人守信，你可以要求自己对人好，但不能期待人家对你好，你怎样对人，并不代表别人家就会怎样对你，如果看不透这一点，你只会增加不必要的烦恼。 （八）我买了十多二十年六合彩，还是一穷二白，，连三奖也没有中，这证明人要发达，还是要努力工作才可以，世界上并没有免费的午餐。 （九）亲人只有一次的缘分，无论这辈子我和你会相处多久，也请好好珍惜共聚的时光，下辈子。无论爱与不爱，都不会再见。 你的爸爸：梁继璋]]></description>
			<content:encoded><![CDATA[<p>我儿：</p>
<p>写这备忘录给你，基于三个原则：</p>
<p>（一）人生福祸无常，谁也不知可以活多久。有些事情还是早一点说好。<br />
（二）我是你的父亲，我不跟你说没有人会跟你说。<br />
（三）这备忘录里记载的，都是我经过惨痛失败得回来的体验，可以为你的成长省走不少冤枉路。</p>
<p>以下，便是你在人生之中好好记住的是：</p>
<p>（一）对你不好的人，你不要太介怀，在你一生中，没有人有义务要对你好，除了我和你妈妈。至于那些对你好的人，你除了要珍惜，感恩外，也请多防备一点，因为，每个人做每件事总有一个原因，他对你好，未必真的是因为喜欢你，请你必须搞清楚，而不必太快将对方看作真朋友。<br />
（二）没有人是不可代替的，没有东西是必须拥有的。看透了这一点。将来你身边的人不再要你，或许失去了世间上最可爱的一切时，也应该明白，这并不是什么大不了不得的事。<br />
（三）生命是短暂的，今日你还在浪费着生命，明日会发觉生命已远离你了。因此，愈早珍惜生命，你享受生命的日子也愈多，与其盼望长寿，倒不如早点享受。<br />
（四）世界上并没有最爱这回事，爱情只是一种霎时的感觉而这感觉绝对会随时间，心境而改变。如果你所谓最爱的离开了你，请耐心的等一下，让时日慢慢冲洗，让心灵慢慢沉淀，你的苦就会慢慢淡化。不要过分憧憬爱情的美，不要过分夸大失恋的悲。<br />
（五）虽然，很多有成就的人士都没受过很多教育，但并不等于不用功读书，就一定能成功。你学到的知识，就是你应有的武器。人，可以白手起家，但不可以手无寸铁，谨记。<br />
（六）我不会要求你供养我下半辈子，同样的我也不会供养你的下半辈子，当你长大到可以独立的时候，我的责任已经完结。以后，你要做巴士还是benz，吃鱼翅还是粉丝，都要自己负责。<br />
（七）你可以要求自己守信，但不能要求别人守信，你可以要求自己对人好，但不能期待人家对你好，你怎样对人，并不代表别人家就会怎样对你，如果看不透这一点，你只会增加不必要的烦恼。<br />
（八）我买了十多二十年六合彩，还是一穷二白，，连三奖也没有中，这证明人要发达，还是要努力工作才可以，世界上并没有免费的午餐。<br />
（九）亲人只有一次的缘分，无论这辈子我和你会相处多久，也请好好珍惜共聚的时光，下辈子。无论爱与不爱，都不会再见。</p>
<p>你的爸爸：梁继璋</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/134/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>大学自编程序大总结(可执行文件+源代码)</title>
		<link>http://wupei.j2megame.org/archives/117</link>
		<comments>http://wupei.j2megame.org/archives/117#comments</comments>
		<pubDate>Sat, 20 Dec 2008 12:25:04 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/117</guid>
		<description><![CDATA[2008年要结束了..大学也即将结束..一切也将有新的开始..是该回首一下了&#8230; 总结一下在大学编写的程序,应该是很有意义的事情,而且好久没有写文章啦&#8230; 看了这个列表,也代表了自己的编程历程,随着代码量的提高,语言学习的改变,对于自己编程技术的一步一步的提升,确实起到了实质上的作用,不过呢,王道还是&#34;实践+理论&#34;,大学其实还是蛮有收获的..虽然还是没有达到自己想到达的地步.. 先来个列表: 打地鼠&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 304行&#160;&#160;&#160;&#160;&#160; &#160; VB&#160; &#160; &#160; &#160; &#160; 2006年1月 &#160; &#160;&#160;&#160; &#160;&#160;&#160; 学生成绩管理系统&#160;&#160;&#160; 600行&#160;&#160;&#160;&#160;&#160; &#160; C&#160;&#160;&#160;...]]></description>
			<content:encoded><![CDATA[<p>
2008年要结束了..大学也即将结束..一切也将有新的开始..是该回首一下了&#8230;
</p>
<p>
总结一下在大学编写的程序,应该是很有意义的事情,而且好久没有写文章啦&#8230;
</p>
<p>
看了这个列表,也代表了自己的编程历程,随着代码量的提高,语言学习的改变,对于自己编程技术的一步一步的提升,确实起到了实质上的作用,不过呢,王道还是<span style="color: #ff0000">&quot;实践+理论&quot;</span>,大学其实还是蛮有收获的..虽然还是没有达到自己想到达的地步..
</p>
<p>
先来个列表:
</p>
<p>
<span id="more-117"></span>
</p>
<ol>
<li>打地鼠&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 304行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; VB&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2006年1月 &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </li>
<li>学生成绩管理系统&nbsp;&nbsp;&nbsp; 600行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; C&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  2006-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </li>
<li>计算器&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 734行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp; VB&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 2006-5</li>
<li>猜数字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 355行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; C++&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 2006-9</li>
<li>黑白棋&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1485行&nbsp;&nbsp;&nbsp;  &nbsp; C++&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;  2006-9</li>
<li>象棋&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 2192行&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; C++&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;  2006-11</li>
<li>一条龙游戏、数字拼图&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; C++ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006年11月25日－26日</li>
<li>黑白棋&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;J2ME&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2006-12-17&nbsp;&nbsp;&nbsp; </li>
<li>黑白棋2.0&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;J2ME&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 2006-12-22</li>
<li>计算器普通&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;VC&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;2007-3-14</li>
<li>ZhaGun程序&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 3200行&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VC&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;2007-5-5 </li>
<li>简易聊天室&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VC</li>
<li>截屏程序&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 1200行左右&nbsp; &nbsp; &nbsp;&nbsp; VC&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </li>
<li>J2ME坦克大战 &nbsp; &nbsp; &nbsp; 7700行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J2ME&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2007-10-8 历时1个月 </li>
<li>Tiny语言词法语法分析器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VC</li>
<li>截屏程序1.7 &nbsp;&nbsp; &nbsp; 3000-4000行&nbsp;&nbsp;&nbsp;&nbsp; VC</li>
<li>校内应用开发&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PHP,HTML,JAVASCRIPT,GOOGLE MAP</li>
<li>http://j2megame.org&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://wupei.j2megame.org</li>
<li>其他的就是商业程序了..还是在大四实习的时候做的..就不总结了</li>
</ol>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<strong><span style="color: #ff0000">一. 打地鼠</span></strong></p>
<p>
代码: 304行&nbsp; 语言:VB&nbsp; 时间: 2006年1月
</p>
<p>
可执行文件与源代码: <a id="res_98" href="http://wupei.j2megame.org/gallery/1/c_hit.rar" title="打地鼠">c_hit.rar</a>
</p>
<p>
示意图:
</p>
<p>
<img src="http://wupei.j2megame.org/gallery/1/c_hit.png" alt="打地鼠示意图" width="313" height="342" />
</p>
<p>
说明:
</p>
<p>
记得做这个程序的时候很有趣..大一上半学期学校开了汇编语言,感觉巨没用,整天在图书馆拿了本VB看(也是看网上的文章介绍的)就那么看啊看..在寒假回家的时候,突发灵感,要编一个VB的打地鼠游戏,幸好当时还学了点photoshop,虽然还不熟..那时候认为什么都要自己做,就开始咯,所有资源都是用potoshop自己做出来了(傻了点,现在看,社会分工还没有想到),编啊编,300多行的程序,愣编了2个通宵..修改BUG的时间非常长..后来才知道..所有变量都用的是全局变量&#8230;那一顿用..自己都搞不清楚哪个是哪个了..还是逻辑思维能力比较弱&#8230;组织不起来这样混乱的IF语句&#8230;还好,自己的第一个像样的程序算是完工了
</p>
<p>
全局变量害死人&#8230;打死我我也不用了&#8230;.555
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">二. 学生成绩管理系统&nbsp;&nbsp;&nbsp;</span></strong>
</p>
<p>
代码: 600行&nbsp; 语言: C&nbsp;&nbsp; 时间:2006-3
</p>
<p>
可执行文件与源代码: <a id="res_100" href="http://wupei.j2megame.org/gallery/1/c_stu.rar" title="学生成绩管理系统">c_stu.rar</a>
</p>
<p>
示意图:
</p>
<p>
<img src="http://wupei.j2megame.org/gallery/1/c_stu.png" alt="学生成绩管理系统" width="517" height="342" />
</p>
<p>
说明:
</p>
<p>
这个用C语言纯写的小小程序,规模就比前面那个大了点,记得还是在学校机房的零碎时间做的,也是无聊闲得,也是为了锻炼一下C语言基础,都是看c primer plus看的,个人感觉技术含量还好,使用了结构体,使用了文件操作,函数过多,当初为了架构这个程序,自己写了满满一张纸的函数名,然后按层次排列下来&#8230;..也是第一次体会到了封装的意义,但是呢,顺序分支太多..那时候还是体会不到参数和返回值的意义&#8230;从来都是void&#8230;哈哈,自己写的状态机还是不错
</p>
<p>
封装很重要..参数与返回值也应该合理应用&#8230;
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">三.<br />
计算器 (普通+科学)&nbsp; &nbsp; &nbsp; </span></strong>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
</p>
<p>
代码:<br />
734行&nbsp;&nbsp;&nbsp; 语言: VB&nbsp;&nbsp;&nbsp; 时间: 2006-5
</p>
<p>
可执行文件与源代码: <a id="res_103" href="http://wupei.j2megame.org/gallery/1/c_vb_calc.rar" title="VB计算器">c_vb_calc.rar</a>
</p>
<p>
示意图:
</p>
<p>
<img src="http://wupei.j2megame.org/gallery/1/c_vb_calc.png" alt="VB计算器" />
</p>
<p>
说明: 这同时也是自己的一个作业程序..给谁做得就不说了..比较烂&#8230;但是还是很锻炼自己了..自己的一个更大的界面程序,其中还掺杂着算术算法,算法是自己摸不透了..直接从C语言书上找来的..后来才知道..居然VB自己有自己的函数..来运算字符串表达式&#8230;这次还是锻炼了逻辑思维..需要非常缜密..出来1+1=3,是很平常的事情..这会会缩进了.是代码漂亮了不少,注释用的也比较好..那时编这个程序属于疯狂状态&#8230;最终还是在网吧完成的这个程序..网吧老板都以为我在给他们的机子在搞什么破坏&#8230;编这个程序自己都不敢去用这个程序..因为程序的BUG还是没有测试到位吧
</p>
<p>
注释,思维逻辑,按键触发,触发事件..干嘛干嘛..
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">四.<br />
猜数字 </span></strong>
</p>
<p>
代码:<br />
355行&nbsp; 语言: C++&nbsp;&nbsp;&nbsp; 时间:2006-9
</p>
<p>
可执行文件与源代码: <a id="res_104" href="http://wupei.j2megame.org/gallery/1/c_guess.rar" title="C++猜数字">c_guess.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<br />
<img src="http://wupei.j2megame.org/gallery/1/c_guess.png" alt="猜数字" width="542" height="354" />
</p>
<p>
说明: 这个是C++老师的第一个作业,因为自己提前学了C++,做起来还是比较容易的,记得当初看C++ primer plus的时候那个痛苦&#8230;哐哐的画线&#8230;到处都是线..就是因为不太理解呗..很复杂..这会用的面向对象的思想也不是太多,一直就是基于对象的,但是输入输出这一块做得还是不错的,还有文件操作
</p>
<p>
面向对象的思想博大精深&#8230;
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">五.<br />
AI黑白棋&nbsp;&nbsp;</span></strong> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p>
代码:<br />
1485行&nbsp;&nbsp;&nbsp;  &nbsp; 语言: C++&nbsp;&nbsp; 时间: 2006-9
</p>
<p>
可执行文件与源代码: <a id="res_107" href="http://wupei.j2megame.org/gallery/1/c_bwc.rar" title="AI黑白棋">c_bwc.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<br />
<img src="http://wupei.j2megame.org/gallery/1/c_bwc.png" alt="AI黑白棋" width="505" height="330" />
</p>
<p>
说明: 这次是黑白棋修改版本,第一个版本输出和这个不太一样,功能类似,这个看起来还是像个样子的,有人机对战,人人对战,排行榜功能,注释写的也很好,把类结构都写出来了..但是呢,这个好像把类和对象的概念给搞混了,好像把每个对象当成了单个类处理(太钻技术的后果),体会到了重用代码的作用,把前面才数字的文件直接拿来用了..(哇..当时那个兴奋,居然可以这样),不过这个出现重要重复问题,复制粘贴(类间相同代码)问题严重了&#8230;.还是架构不太好,还实现了自己的AI,应该是自己的唯一的一个实现AI的游戏,大片的IF语句进行判定,既没有运用到树判定,也没有运用到游戏的随机性&#8230;.这个游戏如果玩的多的话,可以按上一盘的步骤再来一次&#8230;(因为IF语句一样嘛&#8230;)
</p>
<p>
/*<br />
&nbsp;* 类结构：<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 1.char&nbsp;&nbsp;&nbsp; che[][]&#8211;键盘的所有字符集合<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; chess类(基类)&#8212;&#8211;|&nbsp;&nbsp;&nbsp; 2.下子&nbsp;&nbsp;&nbsp; changeche(int x,int y,char ch)&nbsp;&nbsp;&nbsp; <br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp;&nbsp;&nbsp; 3.显示棋盘 showche()<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp;&nbsp;&nbsp; 4.取子&nbsp; getche(int x,int y)<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; |<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; yochess类(virtual public)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aichess类(virtual public)<br />
&nbsp;*<br />
&nbsp;* private:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool yoche[][]:&nbsp;&nbsp;&nbsp; your可下子的地方&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; bool aiche[][]:&nbsp; AI可下子的地方<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp; yonum&nbsp;&nbsp;&nbsp; : 当前子数&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; int ainum&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp; 当前子数<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; int score;&nbsp;&nbsp;&nbsp; <br />
&nbsp;* public:<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; your输入:bool yoset(int x,int y)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; AI输入:bool aiset(int x,int y)<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool yoresult()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; bool airesult()&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
&nbsp;*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
&nbsp;*<br />
&nbsp;* 棋盘模式：<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ai:*&nbsp; your:@<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp;&nbsp;&nbsp; 1 2 3 4 5 6 7 8 &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 1 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 2 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 3 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 4 &#8211; - &#8211; * @ &#8211; - &#8211; &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 5 &#8211; - &#8211; @ * &#8211; - &#8211; &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 6 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 7 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;&nbsp; 8 &#8211; - &#8211; - &#8211; - &#8211; - &quot; &lt;&lt; endl;<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*/
</p>
<p>
上面是自己写的注释, 呵呵..还是比较不错的&#8230;
</p>
<p>
这时已经需要提前设计类架构了,但是面向对象思路还是比较混乱,
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">六.<br />
象棋(未实现AI版本)</span></strong>
</p>
<p>
代码:<br />
2192行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语言: C++&nbsp;&nbsp;&nbsp;&nbsp; 时间:  2006-11
</p>
<p>
可执行文件与源代码: <a id="res_109" href="http://wupei.j2megame.org/gallery/1/c_chinachess.rar" title="中国象棋">c_chinachess.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<br />
<img src="http://wupei.j2megame.org/gallery/1/c_chinachess.png" alt="中国象棋" width="500" height="554" />
</p>
<p>
说明: 仍旧是C++程序设计作业,这个程序可是超级费劲了,有了黑白棋的基础应该差不多了吧,但是这个象棋的算法,实在是太复杂了&#8230;各种棋子的走的方式都不行,也要判断失败走法&#8230;各种类掺和到一起..致使自己不得不类似于UML图的形式表现出类框架,虽然框架设计出来还是比较烂的..但是总比没有要强..这点还是做得比较好的,还使用了有名常量进行定义,还是有大片代码重复情况&#8230;复制粘贴..带来了调试的极大问题,这个程序也未实现AI,实在想不出..AI怎么设计&#8230;(跟象棋水平有直接关系)
</p>
<p>
<img src="http://wupei.j2megame.org/gallery/1/c_chinachess_class.jpg" alt="类架构" width="457" height="366" />
</p>
<p>
这次已经出现上了架构上的我问题了..由于东西太多,代码相对复杂一些,弩架不住了..经过向老师的询问..诶..知道了,出现了一个&quot;设计模式&quot;的名词
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">七.<br />
一条龙游戏、数字拼图</span></strong>
</p>
<p>
语言: C++ &nbsp; 日期: 2006年11月25日－26日
</p>
<p>
&quot;数字拼图&quot;可执行文件与源代码:<br />
<a id="res_112" href="http://wupei.j2megame.org/gallery/1/c_shuzi.rar" title="数字拼图">c_shuzi.rar</a>
</p>
<p>
&quot;一条龙&quot;可执行文件与源代码:<br />
<a id="res_113" href="http://wupei.j2megame.org/gallery/1/c_long.rar" title="一条龙游戏">c_long.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<br />
<img src="http://wupei.j2megame.org/gallery/1/c_shuzi.png" width="462" height="302" />
</p>
<p>
说明: 一共有7个程序小作业,那时我好像在2天之内就完成了..有一天都编疯啦,从下午1点编到晚上11点熄灯..都没吃饭&#8230;呵呵.疯狂..不知道哪来的劲头,感觉还是很过瘾的,这个数字拼图游戏个人感觉很有创意的,因为看似是直接响应按键的,其实还是跟以前一下,只不过按键不缓存了,跟真实的界面程序表现上是一致的,这个程序的内部数据结构也很巧,全部是指针,指来指去的&#8230;每按一次,就切换一次,很酷&#8230;但是这个游戏至今我自己还没通关过&#8230;不会玩
</p>
<p>
现在又归回到了表现层,是直接提升程序品质的东西,界面友好也需要良好体现
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">八. 黑白棋 </span></strong>
</p>
<p>
<strong><span style="color: #ff0000">九. 黑白棋2.0</span></strong>
</p>
<p>
语言: J2ME &nbsp; 日期: 2006-12-22
</p>
<p>可执行文件和源代码见这里: <a href="http://www.j2megame.org/index.php/component/option-com_docman/task-doc_details/gid-103/Itemid-117.html" target="_blank" title="黑白棋">打开</a></p>
<p>
&nbsp;
</p>
<p>
示意图:
</p>
<p>
&nbsp;<img src="http://www.j2megame.org/images/stories/jar/blackwhitechess.png" width="240" height="310" />
</p>
<p>
说明: 当时这个程序速度还算惊人,是大二的时候实习前提交的作品,一开始还是不会JAVA,用3天的时间学了学JAVA,就上手编写这个J2ME程序,然后就近公司实习了..呵呵..还是挺诡异的..这个移植方面做的还好..具体算法是使用了前面C++时用的算法,直接就拿过来用了..又是面向对象的好处
</p>
<p>
移动终端啊..屏幕移植当初是涉及到的第一个问题..幸好这个程序是自适应的..呵呵
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十. 计算器普通</span></strong>
</p>
<p>
语言: VC&nbsp; 日期: 2007-3-14
</p>
<p>说明: 这个程序没什么可说的,就是普通型,主要是熟悉MFC的框架,和按键响应,这个技术含量就很低了..</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十一. 轧辊管理程序(数据库应用) </span></strong>
</p>
<p>
代码: 3200行&nbsp;&nbsp;&nbsp; 语言: VC + Access&nbsp; 时间: 2007-5-5
</p>
<p>
可执行文件与源代码: <a id="res_115" href="http://wupei.j2megame.org/gallery/1/c_zhagun.rar">c_zhagun.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<img src="http://wupei.j2megame.org/gallery/1/c_zhagun.png" alt="轧辊示意图" width="576" height="358" />
</p>
<p>
说明: 这个是为父亲厂子编写的一个管理系统,就是简单Access数据库的增删改查的操作,20个小时的连续编程是一个很爽的事情..主要就是用C++连接数据库,然后提供增删改查的操作,一共就两张表,一张是主表,一张是附表,逻辑上是嵌套的关系&#8230;这个其实挺锻炼人的..也是当时自己写的最长的程序,不过复制粘贴现象更加严重了&#8230;好多重复的代码&#8230;一开始设计的也不是很好..好像就没有设计..像MFC程序不知道怎么设置类体系..因为他本身,我觉得就挺乱的..
</p>
<p>
第一个数据库程序..但是写起来真是挺费劲的&#8230;这种程序还是不用VC来写比较好&#8230;会更快一些
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十二. 简易聊天室&nbsp; (socket编程)</span></strong>
</p>
<p>
语言: C++&nbsp;
</p>
<p>
服务器端和客户端可执行文件与源代码: <a id="res_117" href="http://wupei.j2megame.org/gallery/1/c_talk.rar" title="简易聊天室">c_talk.rar</a>
</p>
<p>
示意图:
</p>
<p>
&nbsp;<img src="http://wupei.j2megame.org/gallery/1/c_talk.png" width="584" height="328" />
</p>
<p>
说明: 这个是VC课程的期末大作业,完成了非阻塞形式的socket的聊天室,这个聊天室实现了最初QQ的功能,类似于以前的网页聊天,是基于明码信息编号的形式来传递信息,每条信息都需要经服务器端进行消息的转发(早期QQ),能私聊,公聊,踢人等功能,感觉上,还算是比较强大的,但是容错性较差,如果出现什么意外情况,如断网&#8230;不知会怎么样&#8230;理论上局域网是可以使用的,需要服务器开启,服务器现在是信息的分发者与当前用户的管理者,第一开始其实服务器端和客户端比较模糊,到最后就成了,服务器端也可以聊天的诡异事情&#8230;
</p>
<p>
基于网络的应用还是不好编啊..动不动的非法关闭了&#8230;痛苦..准备实现J2ME网络应用程序
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十三. 截屏程序</span></strong>
</p>
<p>
平台: VC&nbsp;&nbsp;&nbsp;  &nbsp; 代码: 1200行左右&nbsp; &nbsp; &nbsp;&nbsp;
</p>
<p>
说明: 暂时这个就不能公布代码了..因为已经发布了..也已经更新了好多个版本,功能和应用上还比较好点了
</p>
<p>
具体可以见这里: <a href="http://wupei.j2megame.org/blog.php/myblog/myworks/2007/07/22/mycatchscreen">MyCatchScreen绿色截屏程序1.7.1 (最后更新:08年6月22日)</a>
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十四. J2ME坦克大战</span></strong>
</p>
<p>
代码: 7700行&nbsp;&nbsp;&nbsp; 平台: J2ME&nbsp; 时间: 2007-10-8 历时1个月
</p>
<p>
示意图:
</p>
<p>
&nbsp;<img src="http://www.j2megame.org/images/stories/jar/battlecity.png" />
</p>
<p>
说明: 这个也是真正就职前的一个程序,虽然商业发布,但也没赚到多少钱..但是总归是第一个拿的出手的游戏,虽然没有一点创新,呵呵,完全模拟是完全的达到了
</p>
<p>
具体信息可以看这里:
</p>
<p>
<a href="http://wupei.j2megame.org/blog.php/myblog/myworks/2007/09/10/j2me-work-battle-city">坦克大战手机版J2ME实现(创游杯参赛作品 &#8211; 未果&#8230;)(最后更新: 08年5月22日 &#8211; 支持诺基亚手机)</a>&nbsp;
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十五. Tiny语言词法、语法分析器展示</span></strong>
</p>
<p>
示意图:
</p>
<p>
<img src="http://wupei.j2megame.org/gallery/1/tiny_2.png" width="505" height="365" />
</p>
<p>
具体信息可参见:&nbsp;
</p>
<p>
<a href="http://wupei.j2megame.org/blog.php/myblog/myworks/2007/12/26/mfc-tiny-compiler" target="_blank">http://wupei.j2megame.org/blog.php/myblog/myworks/2007/12/26/mfc-tiny-compiler</a>
</p>
<p>
说明:这个还是比较酷的,是学习编译原理的期末大作业,自己琢磨了好久,写了好递归算法,进行词法与语法分析,然后展示的效果还不错,使用了一个开源的代码,是树状控件,表达成了这样,看起来更加语法树的构成了,这个的编写,很考验对于数据结构的应用,这会实现了把树型结构的指针,挺复杂的&#8230;.自己还做了一个精湛的PPT,但是老师最终也没让我讲..伤心了..(还跟我说让我讲,白让我那么费劲做了&#8230;)
</p>
<p>
数据结构也很重要,尤其是复杂的数据结构,需要进一步了解的
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<strong><span style="color: #ff0000">十六. 校内扩展API应用</span></strong></p>
<p>
说明: 小小的google map的应用,因为好友的信息交流次数过多,访问几次就把自己的空间拖垮了,就500错误了..可悲..也没优化过..就是简单了编了一下,运用了php javascript html混合编程..那就更加痛苦了..3层嵌套进去,一层一层的套进去,可想复杂程度&#8230;自己还不太像往网站方向发展,就当乐趣,偶尔编一下了..呵呵
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
<strong><span style="color: #ff0000">十七. J2ME手机游戏开发网和个人博客 </span></strong>
</p>
<p>
说明: 这两个现在都还好..前者现在排名还是比较靠前的..访问量还好..叫他慢慢的聚集人气吧..主要还是自己的个人站点,服务自己,也服务他人,这就是原则啦,虽然自己不善于网站方面的编码(但我会改!哈哈),只用框架而已,但还可以认识朋友,好多好多好处,呵呵,偶尔写一个技术文章也挺好
</p>
<p>
&nbsp;
</p>
<hr width="100%" size="2" />
<p>
OK了..终于总结完了..好累..看现在已经凌晨1点了,从晚上9点写到现在&#8230;
</p>
<p>
回头看一下大学,还是蛮丰富多彩的..呵呵,成就感的&#8230;
</p>
<p>
就这吧..</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/117/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Antenna生成JAD和MANIFEST.MF中文乱码一种解决方法(UTF-8)</title>
		<link>http://wupei.j2megame.org/archives/114</link>
		<comments>http://wupei.j2megame.org/archives/114#comments</comments>
		<pubDate>Sat, 14 Jun 2008 06:58:40 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/114</guid>
		<description><![CDATA[注意: 本文章针对antenna-src-1.0.2.zip, 请查看antenna是否有最新版本 最近配置Antenna成功了,也可以正常使用了 但是在给真正的J2ME游戏打包时,就发现问题了,如果让 MIDlet-Name 使用中文的话,就会生成JAD乱码&#8230; 查过文档以后,发现生成JAD时可以使用 encoding 属性, OK, 添加上 encoding=&#34;UTF-8&#34; ,打包&#8230;.依然有问题&#8230;生成的 JAD 依然不是 UTF-8 格式 然后没有办法,只有查看 Antenna...]]></description>
			<content:encoded><![CDATA[<p>
<span style="color: #ff0000;text-decoration:underline">注意: 本文章针对antenna-src-1.0.2.zip, 请查看antenna是否有最新版本</span>
</p>
<p>
最近配置Antenna成功了,也可以正常使用了
</p>
<p>
但是在给真正的J2ME游戏打包时,就发现问题了,如果让 <span style="color: #ff0000">MIDlet-Name</span> 使用中文的话,就会生成JAD乱码&#8230;
</p>
<p>
查过文档以后,发现生成JAD时可以使用 <span style="color: #ff0000">encoding</span> 属性, OK, 添加上 <span style="color: #ff0000">encoding=&quot;UTF-8&quot;</span> ,打包&#8230;.依然有问题&#8230;生成的 JAD 依然不是 UTF-8 格式
</p>
<p>
然后没有办法,只有查看 Antenna 源代码了.. 下载 Antenna的src&nbsp;
</p>
<p>
<a href="http://sourceforge.net/project/showfiles.php?group_id=67420" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=67420</a>&nbsp;
</p>
<p>
<span id="more-114"></span>
</p>
<p>
看一下源代码,OK,关系到乱码的3个Java文件
</p>
<p>
<span style="color: #ff0000">de.pleumann.antenna.misc.JadFile.java</span>&nbsp; A simple class to access the contents of a JAD file(就是保存JAD文件内容的封装类,而且MANIFEST.MF文件也用这个生成的) &#8212; <span style="color: #ff0000">这个文件没有问题,参数也都是有的</span>
</p>
<p>
<span style="color: #ff0000">de.pleumann.antenna.WtkJad.java</span> (是生成JAD的类封装,与wtkjad的XML的命令相对应) &#8212; <span style="color: #ff0000">这个文件也是OK的,参数都使用了 encoding </span>
</p>
<p>
<span style="color: #ff0000">de.pleumann.antenna.WtkPackage</span> (是打包的类封装,与wtkpackage的XML的命令相对应) &#8212; <span style="color: #ff0000">这个文件大有问题,因为传的参 encoding 都是 null&nbsp;</span>
</p>
<p>
说明: execute() 函数,为后两个类的的执行函数&nbsp;
</p>
<p>
恩,找到问题了,就好解决了,开始修改吧, 把类似以下语句都修改了
</p>
<p><pre java>jad.load(jadFile.getAbsolutePath(), null);
//或
man.save(manFile, null);</pre>
</p>
<p>
修改为:
</p>
<p><pre java>jad.load(jadFile.getAbsolutePath(), "UTF-8");
//或
man.save(manFile, "UTF-8");</pre>
</p>
<p>
这样存取都为UTF-8格式了&nbsp;
</p>
<p>
恩,可以了,关闭eclipse,重新编译打包,覆盖原来添加到Eclipse中的 antenna-bin-1.0.2.jar ,恩,呵呵,这就是你自己的 antenna 版本
</p>
<p>
重新打开eclipse,重新执行,执行后发现,JAD没问题了,但是&#8230;..<span style="color: #ff0000">MANIFEST.MF</span>从JAR拿出来后,用记事本观看&#8230;还是乱码&#8230;.
</p>
<p>
经过我的检测(其实就是把.MF存出来),发现 MANIFEST.MF 其实是没问题的,UTF-8没问题,也不乱码,但是经过 <span style="color: #ff0000">Ant</span> 中的 <span style="color: #ff0000">打包函数</span> 后, 加入到JAR包中,UTF-8格式没变,但是中文内容乱码了&#8230;..
</p>
<p>
在Antenna的src中的语句为:
</p>
<p><pre java>super.execute();</pre>
</p>
<p>
就是这句造成了乱码,因为是 Ant 1.7.0 运行库中的东西&#8230;.我没有能力修改&#8230;&nbsp;
</p>
<p>
传说好像是 Ant 的 BUG&#8230;.
</p>
</p>
<p>
<span style="color: #ff0000">6月15日更新:</span> MANIFEST.MF中文乱码完美解决了!    添加  <span style="color: #ff0000">wtkpackage</span> 字段  <span style="color: #ff0000">keepManifestOrder=&#8221;true&#8221;</span> 就OK,很简单吧&#8230;
</p>
<p>
查看一下Antenna源代码,才知道,实际上,运行 keepManifestOrder 语句之前, Ant 已经把 MF 文件打到 JAR 包中了<span style="color: #ff0000">(这一MF是乱码状态)</span>,而这一语句,使刚才生成的 MF 文件,<span style="color: #ff0000">重新写入 JAR</span> (这一个是Antenna实现的),所以就不乱码咯,哈哈,但是有一个tmp目录没有清空,这是因为 manF流 没有关闭的原因,这个没啥关系的,修改一下代码,见最后<br />
注: 看了代码才知道,可以这样更新 MF 文件啊,哈哈,强大!
</p>
<p>
来看一下修改的XML片段:
</p>
<p><pre xml>&lt;wtkpackage jarfile="${dir.output.deployed}\${jar.filename}.jar"
	jadfile="${dir.output.deployed}\${jad.filename}.jad"
	obfuscate="${wtk.obfuscate}" preverify="true"
	classpath="${dir.classpath}" keepManifestOrder="true"&gt;

	&lt;fileset dir="${dir.output.classes}" /&gt;
&lt;/wtkpackage&gt;</pre>
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
以下说的皆是P话&#8230;..但是为了保留思路,大家可以考虑一下哦&#8230;就当是思路拓展了,呵呵
</p>
<p>
<span style="color: #ff0000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;以下已删除&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span>
</p>
<p>
没办法,只能另寻途径,一开始想直接用JAR命令,直接更新 MANIFEST.MF ,但是我最终未实验成功&#8230;.(或许你会成功&#8230;因为我还没学会呢&#8230;)
</p>
<p>
 <span style="color: #ff0000">注意:</span> 本方法使用以后JAD的 <span style="color: #ff0000">MIDlet-Jar-Size 字段</span>,就不正确了&#8230;.待解决
</p>
<p>
我用了一种办法,是使用 <span style="color: #ff0000">WinRAR 中的命令行</span>,进行 MANIFEST.MF 的替换
</p>
<p>
1. 修改 <span style="color: #ff0000">de.pleumann.antenna.WtkPackage</span> 文件,使得其在运行过程中导出(存储)一个 MANIFEST.MF
</p>
<p>
在execute()函数末尾添加语句: &nbsp;
</p>
<p><pre java>final String myMf = "build/MANIFEST.MF"; //存到你喜欢的位置
try {
	man.save(myMf, "UTF-8");
	System.out.println("myMf: build/MANIFEST.MF create.");
} catch (IOException e) {
	System.out.println("build/MANIFEST.MF create error.");
}</pre>
</p>
<p>
我存储到了 Build 文件夹下,这样就可以使用 WINRAR 将其打包到 JAR 中
</p>
<p>
修改相应的XML文件(前一篇文章有相关的XML):
</p>
<p><pre xml>&lt;!-- 因为命令行不支持带空格的命令,所以如果WINRAR路径中有空格,要加引号 --&gt;
&lt;property name="winrar.home" value="C:\Program\WinRAR" /&gt;
&lt;!-- 用winrar 更新 MF 文件 --&gt;
&lt;exec dir="${dir.output}" executable="cmd.exe" os="Windows XP" &gt;
	&lt;arg line="/c ${winrar.home}\WinRAR.exe A -apMETA-INF ${dir.output.deployed}\${jar.filename}.jar MANIFEST.MF"/&gt;
&lt;/exec&gt;</pre>
</p>
<p>
当然这种办法,连我都不是很喜欢&#8230;.但是我没办法&#8230;这个也不具有通用性&#8230;如果你知道更方便,更通用的方法,告诉我一声啊,谢了
</p>
<p>
将WINRAR的注释去掉即可&#8230;.记得修改你生成 <strong><span style="color: #ff0000">MANIFEST.MF</span></strong> 路径
</p>
<p>
<span style="color: #ff0000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;以上已删除&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span>
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
这样就OK了,哈哈,终于完美解决乱码问题啦&#8230;..可以继续自己的工作了
</p>
<p>
XML文件的文章:&nbsp; <a href="http://wupei.j2megame.org/blog.php/myblog/j2me/2008/06/14/j2me-antenna" target="_blank">《Eclipse与Antenna整合开发J2ME程序》</a>
</p>
<p>
&nbsp;
</p>
<p>
关于tmp文件夹没有删除的小BUG的代码修改:
</p>
<p><pre java>//de.pleumann.antenna.WtkPackage.java文件
//void addManifest(File tmpDir, File manFile)函数
//(大约在325行)
manF.close(); //添加
jos.flush();
jos.close();
utility.delete(jarFile);
utility.copy(tmp, jarFile);</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/114/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Eclipse与Antenna整合开发J2ME程序</title>
		<link>http://wupei.j2megame.org/archives/113</link>
		<comments>http://wupei.j2megame.org/archives/113#comments</comments>
		<pubDate>Sat, 14 Jun 2008 06:12:35 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/113</guid>
		<description><![CDATA[最近一直在寻找一种简单的方式来给J2ME程序打包,包括预处理,生成JAD,JAR的一系列自动化处理 Antenna就可以实现这一系列功能,个人觉得比polish相对要简单一些,也傻瓜一些,可以说是专门为j2me开发的一套ant的扩展 Antenna官方下载: http://sourceforge.net/project/showfiles.php?group_id=67420 Antenna文档首页: http://antenna.sourceforge.net/&#160; 写下本文时的,相关程序的版本: Eclipse 3.3.2 + EclipseMe 1.7.7 + antenna 1.0.2&#160; 下面就开始配置: 1. 下载: 去下载首页,下载 antenna-bin-1.0.2.jar...]]></description>
			<content:encoded><![CDATA[<p>
最近一直在寻找一种简单的方式来给J2ME程序打包,包括预处理,生成JAD,JAR的一系列自动化处理
</p>
<p>
Antenna就可以实现这一系列功能,个人觉得比polish相对要简单一些,也傻瓜一些,可以说是专门为j2me开发的一套ant的扩展
</p>
<p>
Antenna官方下载: <a href="http://sourceforge.net/project/showfiles.php?group_id=67420" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=67420</a>
</p>
<p>
Antenna文档首页: <a href="http://antenna.sourceforge.net/" target="_blank">http://antenna.sourceforge.net/</a>&nbsp;
</p>
<p>
<span id="more-113"></span>
</p>
<p>
<span style="color: #ff0000">写下本文时的,相关程序的版本:</span>
</p>
<p>
Eclipse 3.3.2 + EclipseMe 1.7.7 + antenna 1.0.2&nbsp;
</p>
<p>
<span style="color: #ff0000">下面就开始配置:</span>
</p>
<p>
1. 下载:
</p>
<p>
去下载首页,下载 <span style="color: #ff0000">antenna-bin-1.0.2.jar</span> (Antenna的执行包)
</p>
<p>
2. 安装:
</p>
<p>
Eclipse 3.3 本身就自带了Ant 1.7版本,所以Ant就不必下了,把那个JAR包,添加过来就可以了&nbsp;
</p>
<p>
打开eclipse
</p>
<p>
菜单 Window -&gt;&nbsp; Preferences -&gt; Ant -&gt; Runtime -&gt; Classpath -&gt; Ant home Entries
</p>
<p>
随便选择一个JAR包,然后点击右边的 Add External JARs, 将下载的包,加入到Eclipse库中
</p>
<p>
这样就可以了,不必安装什么插件什么的
</p>
<p>
3. 添加 build.xml&nbsp;
</p>
<p>
也不用在工程项目点击邮件,自动生成XML,这样我个人认为也不好用
</p>
<p>
OK,自己书写一个XML就可以了
</p>
<p>
我的一个示例<span style="color: #ff0000">(需要存储为UTF-8格式文件)</span> (6月15日更新):
</p>
<p><pre xml>&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;project name="brick" default="build"&gt;

	&lt;taskdef resource="antenna.properties" /&gt;

	&lt;target name="init" description="变量定义"&gt;
		&lt;echo message="Define variable" /&gt;

		&lt;!-- 机型 --&gt;
		&lt;property name="mobile.vendor" value="Nokia/7610" /&gt;

		&lt;!-- JAD与JAR --&gt;
		&lt;property name="jad.filename" value="brick" /&gt;
		&lt;property name="jad.midlet-name" value="brick" /&gt;
		&lt;property name="jad.midlet-vender" value="wp" /&gt;
		&lt;property name="jad.midlet-version" value="1.0.0" /&gt;
		&lt;property name="jad.midlet-class" value="brick.BrickMidlet" /&gt;
		&lt;property name="jad.midlet-icon" value="/icon.png" /&gt;

		&lt;!-- WTK参数 --&gt;
		&lt;property name="wtk.cldc.version" value="1.0" /&gt;
		&lt;property name="wtk.midp.version" value="2.0" /&gt;
		&lt;property name="wtk.obfuscate" value="true" /&gt;
		&lt;property name="wtk.debug" value="false" /&gt;
		&lt;property name="jad.manifast.version" value="1.0"/&gt;

		&lt;!-- 预处理信息显示 --&gt;
		&lt;property name="mobile.show" value="false" /&gt;
		&lt;property name="dist.show" value="false" /&gt;

		&lt;!-- 系统参数 --&gt;
		&lt;property name="basedir" value="." /&gt;
		&lt;property name="wtk.home" value="D:\WTK2.5.1" /&gt;
		&lt;property name="wtk.proguard.home" value="D:\proguard4.2" /&gt;

		&lt;!-- 不被修改的参数 --&gt;
		&lt;property name="jar.filename" value="${jad.filename}" /&gt;

		&lt;!-- 目录定义 --&gt;
		&lt;property name="dir.src" value="${basedir}\src" /&gt;
		&lt;property name="dir.res" value="${basedir}\res" /&gt;
		&lt;property name="dir.output" value="${basedir}\build" /&gt;

		&lt;property name="dir.output.dist" value="${dir.output}\dist" /&gt;
		&lt;property name="dir.output.classes" value="${dir.output}\classes" /&gt;
		&lt;property name="dir.output.deployed" value="${dir.output}\deployed" /&gt;
	&lt;/target&gt;

	&lt;target name="clean" depends="init" description="初始化环境"&gt;
		&lt;echo message="Clean dir" /&gt;

		&lt;delete dir="${dir.output}" /&gt;
	&lt;/target&gt;

	&lt;target name="preprocess" depends="init,clean" description="预处理"&gt;
		&lt;echo message="preprocess" /&gt;

		&lt;mkdir dir="${dir.output.dist}" /&gt;

		&lt;wtkpreprocess srcdir="${dir.src}" destdir="${dir.output.dist}"
			device="${mobile.vendor}" verbose="${mobile.show}"
			printsymbols="${dist.show}" /&gt;
	&lt;/target&gt;

	&lt;target name="compile" depends="preprocess" description="编译"&gt;
		&lt;echo message="Starting compile" /&gt;

		&lt;mkdir dir="${dir.output.classes}" /&gt;

		&lt;echo&gt;build from all the ${dir.src} to ${dir.output.classes}&lt;/echo&gt;

		&lt;wtkbuild srcdir="${dir.output.dist}" destdir="${dir.output.classes}"
			debug="${wtk.debug}" &gt;
		&lt;/wtkbuild&gt;
	&lt;/target&gt;

	&lt;target name="build" depends="compile" description="生成"&gt;
		&lt;echo message="Packaging library" /&gt;

		&lt;copy todir="${dir.output.classes}"&gt;
			&lt;fileset dir="${dir.res}" /&gt;
		&lt;/copy&gt;

		&lt;mkdir dir="${dir.output.deployed}" /&gt;

		&lt;!-- 执行自己修改的wtkjad --&gt;
		&lt;wtkjad jadfile="${dir.output.deployed}\${jad.filename}.jad"
			name="${jad.midlet-name}" vendor="${jad.midlet-vender}"
			version="${jad.midlet-version}" encoding="UTF-8"&gt;

			&lt;midlet name="${jad.midlet-class}" icon="${jad.midlet-icon}"
				class="${jad.midlet-class}" /&gt;

			&lt;attribute name="MIDlet-Icon" value="${jad.midlet-icon}" /&gt;
			&lt;attribute name="MicroEdition-Configuration" value="CLDC-${wtk.cldc.version}" /&gt;
			&lt;attribute name="MicroEdition-Profile" value="MIDP-${wtk.midp.version}" /&gt;
			&lt;attribute name="Manifest-Version" value="${jad.manifast.version}" /&gt;
		&lt;/wtkjad&gt;

		&lt;!-- 执行自己修改的wtkpackage --&gt;
		&lt;wtkpackage jarfile="${dir.output.deployed}\${jar.filename}.jar"
			jadfile="${dir.output.deployed}\${jad.filename}.jad"
			obfuscate="${wtk.obfuscate}" preverify="true"
			keepManifestOrder="true"&gt;

			&lt;fileset dir="${dir.output.classes}" /&gt;
		&lt;/wtkpackage&gt;

		&lt;!-- 用winrar 更新 MF 文件 本块已经无作用,请参考本博客关于Antenna乱码的文章
		&lt;exec dir="${dir.output}" executable="cmd.exe" os="Windows XP" &gt;
			&lt;arg line="/c ${winrar.home}\WinRAR.exe A -apMETA-INF ${dir.output.deployed}\${jar.filename}.jar MANIFEST.MF"/&gt;
		&lt;/exec&gt;
		--&gt;
	&lt;/target&gt;

	&lt;!--下面可以根据需要，可以增加run task
    &lt;target name="run" depends="build"&gt;
        &lt;wtkrun jadfile="${dir.output}/${jad.filename}.jad"
                device="DefaultColorPhone" wait="true" &gt;
        &lt;/wtkrun&gt;
    &lt;/target&gt;
	--&gt;
&lt;/project&gt;</pre>
</p>
<p>
<span style="color: #ff0000">说明:</span>
</p>
<ol>
<li>
	直接把这个文件存为 Build.xml,放在工程的根目录上,eclipse的工程目录刷新一下,就OK了&nbsp;
	</li>
<li>
	记得自己更改自己的WTK和Proguard路径,还有一些其他的JAD属性和Midlet属性&nbsp;
	</li>
<li>
	还有就是当前这个版本,是不支持JAD和MANIFEST.MF<span style="color: #ff0000">中文名字</span>的,也就是暂时不支持UTF-8格式,就会造成<span style="color: #ff0000">中文乱码</span>,是因为Antenna包的问题, 我认为是BUG,但是看到官方说明上,也已经提醒了,以后会支持UTF-8格式,我个人已经发现这个问题的一个解决方法,可以看一下这篇文章 <a href="http://wupei.j2megame.org/blog.php/myblog/j2me/2008/06/14/antenna-jad-manifest" target="_blank">《Antenna生成JAD和MANIFEST.MF中文乱码一种解决方法(UTF-8)》</a></li>
</ol>
<p>
4. 添加预处理
</p>
<p><pre java>//#ifdef Nokia/7610
//# System.out.println("如果是7610机型,会自动生成");
//#else
      System.out.println("不是7610机型,自动屏蔽");
//#endif</pre>
<p>
预处理以后,会<span style="color: #ff0000">自动处理</span>,很方便吧,以后移植起来就很方便了,而且还支持XML的参数,也可以控制J2ME程序不同版本,相当的强大!更多的预处理功能,参考官方文档就可以了
</p>
</p>
<p>
6. 运行
</p>
<p>
在左边的工程区,找到Build.xml,右键 Ant Build, OK, 运行完毕,生成
</p>
<p>
<span style="color: #ff0000">5. 我写的XML,生成目录结构</span>
</p>
<p>
-工程目录<br />
&nbsp;&nbsp;&nbsp; -bin<br />
&nbsp; &nbsp; -src<br />
&nbsp;&nbsp;&nbsp; -res<br />
&nbsp;&nbsp;&nbsp; -build (Antenna打包路径)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -classes (存放class文件和资源文件)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -deployed (生成的jad和jar文件)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -dest (预编译后,生成的java文件)<br />
&nbsp;&nbsp;&nbsp; -deployed
</p>
<p>
参考文章: <a href="http://www.javaeye.com/topic/117568" target="_blank">《Antenna与j2me打包》</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/113/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>谈谈Unicode编码，简要解释UCS、UTF、BMP、BOM等名词</title>
		<link>http://wupei.j2megame.org/archives/112</link>
		<comments>http://wupei.j2megame.org/archives/112#comments</comments>
		<pubDate>Sat, 31 May 2008 17:14:09 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/112</guid>
		<description><![CDATA[转自: http://blog.csdn.net/fmddlmyy/&#160; 这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题： 问题一： 使用Windows记事本的&#8220;另存为&#8221;，可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？ 我 很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode big endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？ 问题二： 最 近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、 GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。 查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。 0、big endian和little...]]></description>
			<content:encoded><![CDATA[<p><span></p>
<p>
转自: <a href="http://blog.csdn.net/fmddlmyy/" target="_blank">http://blog.csdn.net/fmddlmyy/</a>&nbsp;
</p>
<p>
<span>这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题：</span>
</p>
<dl>
<dt><span>问题一： </span></dt>
<dd>
<p>
<span>使用Windows记事本的&ldquo;另存为&rdquo;，可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？</span>
</p>
<p>
<span>我<br />
很早前就发现Unicode、Unicode big<br />
endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode big<br />
endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？</span>
</p>
<p>
<span id="more-112"></span>
</p>
</dd>
<dt><span>问题二： </span></dt>
<dd><span>最<br />
近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、<br />
GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。 </span></dd>
</dl>
<p>
<span>查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。</span>
</p>
<h3>0、big endian和little endian</h3>
<p>
<span>big<br />
endian和little<br />
endian是CPU处理多字节数的不同方式。例如&ldquo;汉&rdquo;字的Unicode编码是6C49。那么写到文件里时，究竟是将6C写在前面，还是将49写在前<br />
面？如果将6C写在前面，就是big endian。还是将49写在前面，就是little endian。</span>
</p>
<p>
<span>&ldquo;endian&rdquo;这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，其中一个皇帝送了命，另一个丢了王位。</span>
</p>
<p>
<span>我们一般将endian翻译成&ldquo;字节序&rdquo;，将big endian和little endian称作&ldquo;大尾&rdquo;和&ldquo;小尾&rdquo;。</span>
</p>
<h3>1、字符编码、内码，顺带介绍汉字编码</h3>
<p>
<span>字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码，为了处理汉字，程序员设计了用于简体中文的GB2312和用于繁体中文的big5。</span>
</p>
<p>
<span>GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。</span>
</p>
<p>
<span>GB2312<br />
支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的<br />
GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平<br />
台必须支持GB18030，对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。</span>
</p>
<p>
<span>从ASCII、<br />
GB2312、GBK到GB18030，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编码<br />
中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK到GB18030都属于双字节字符集<br />
(DBCS)。</span>
</p>
<p>
<span>有的中文Windows的缺省内码还是GBK，可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符，普通人是很难用到的，通常我们还是用GBK指代中文Windows内码。</span>
</p>
<p>
<span>这里还有一些细节：</span>
</p>
<ul>
<li>
<p>
	<span>GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。</span>
	</p>
</li>
<li>
<p>
	<span>在DBCS中，GB内码的存储格式始终是big endian，即高位在前。</span>
	</p>
</li>
<li>
<p>
	<span>GB2312<br />
	的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影<br />
	响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。</span>
	</p>
</li>
</ul>
<h3>2、Unicode、UCS和UTF</h3>
<p>
<span>前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如&ldquo;汉&rdquo;字的Unicode编码是6C49，而GB码是BABA。</span>
</p>
<p>
<span>Unicode<br />
也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是&quot;Universal<br />
Multiple-Octet Coded Character Set&quot;，简称为UCS。UCS可以看作是&quot;Unicode Character<br />
Set&quot;的缩写。</span>
</p>
<p>
<span>根据维基百科全书(http:<br />
//zh.wikipedia.org/wiki/)的记载：历史上存在两个试图独立设计Unicode的组织，即国际标准化组织（ISO）和一个软件制<br />
造商的协会（unicode.org）。ISO开发了ISO 10646项目，Unicode协会开发了Unicode项目。</span>
</p>
<p>
<span>在1991年前后，双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果，并为创立一个单一编码表而协同工作。从Unicode2.0开始，Unicode项目采用了与ISO 10646-1相同的字库和字码。</span>
</p>
<p>
<span>目前两个项目仍都存在，并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。</span>
</p>
<p>
<span>UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码，是由UTF(UCS Transformation Format)规范规定的，常见的UTF规范包括UTF-8、UTF-7、UTF-16。</span>
</p>
<p>
<span>IETF<br />
的RFC2781和RFC3629以RFC的一贯风格，清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是<br />
Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。</span>
</p>
<h3>3、UCS-2、UCS-4、BMP</h3>
<p>
<span>UCS有两种格式：UCS-2和UCS-4。顾名思义，UCS-2就是用两个字节编码，UCS-4就是用4个字节（实际上只用了31位，最高位必须为0）编码。下面让我们做一些简单的数学游戏：</span>
</p>
<p>
<span>UCS-2有2^16=65536个码位，UCS-4有2^31=2147483648个码位。</span>
</p>
<p>
<span>UCS<br />
-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为<br />
256行 (rows)，每行包含256个cells。当然同一行的cells只是最后一个字节不同，其余都相同。</span>
</p>
<p>
<span>group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中，高两个字节为0的码位被称作BMP。</span>
</p>
<p>
<span>将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节，就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。</span>
</p>
<h3>4、UTF编码</h3>
<p>
<span>UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下：</span>
</p>
<table border="1" width="75%">
<tbody>
<tr>
<td><span>UCS-2编码(16进制)</span></td>
<td><span>UTF-8 字节流(二进制)</span></td>
</tr>
<tr>
<td><span>0000 &#8211; 007F</span></td>
<td><span>0xxxxxxx</span></td>
</tr>
<tr>
<td><span>0080 &#8211; 07FF</span></td>
<td><span>110xxxxx 10xxxxxx</span></td>
</tr>
<tr>
<td><span>0800 &#8211; FFFF</span></td>
<td><span>1110xxxx 10xxxxxx 10xxxxxx</span></td>
</tr>
</tbody>
</table>
<p>
<span>例如&ldquo;汉&rdquo;字的Unicode编码是6C49。6C49在0800-FFFF之间，所以肯定要用3字节模板了：<span style="color: #0000ff">1110</span>xxxx <span style="color: #0000ff">10</span>xxxxxx <span style="color: #0000ff">10</span>xxxxxx。将6C49写成二进制是：0110 110001 001001， 用这个比特流依次代替模板中的x，得到：<span style="color: #0000ff">1110</span>0110 <span style="color: #0000ff">10</span>110001 <span style="color: #0000ff">10</span>001001，即E6 B1 89。</span>
</p>
<p>
<span>读者可以用记事本测试一下我们的编码是否正确。</span>
</p>
<p>
<span>UTF<br />
-16以16位为单元对UCS进行编码。对于小于0&#215;10000的UCS码，UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于<br />
0&#215;10000的UCS码，定义了一个算法。不过由于实际使用的UCS2，或者UCS4的BMP必然小于0&#215;10000，所以就目前而言，可以认为UTF<br />
-16和UCS-2基本相同。但UCS-2只是一个编码方案，UTF-16却要用于实际的传输，所以就不得不考虑字节序的问题。</span>
</p>
<h3>5、UTF的字节序和BOM</h3>
<p>
<span>UTF<br />
-8以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如收<br />
到一个&ldquo;奎&rdquo;的Unicode编码是594E，&ldquo;乙&rdquo;的Unicode编码是4E59。如果我们收到UTF-16字节流&ldquo;594E&rdquo;，那么这是&ldquo;奎&rdquo;还是<br />
&ldquo;乙&rdquo;？</span>
</p>
<p>
<span>Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是&ldquo;Bill Of Material&rdquo;的BOM表，而是Byte Order Mark。BOM是一个有点小聪明的想法：</span>
</p>
<p>
<span>在UCS<br />
编码中有一个叫做&quot;ZERO WIDTH NO-BREAK<br />
SPACE&quot;的字符，它的编码是FEFF。而FFFE在UCS中是不存在的字符，所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前，先传输<br />
字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;。</span>
</p>
<p>
<span>这样如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。因此字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;又被称作BOM。</span>
</p>
<p>
<span>UTF<br />
-8不需要BOM来表明字节顺序，但可以用BOM来表明编码方式。字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;的UTF-8编码是EF<br />
BB BF（读者可以用我们前面介绍的编码方法验证一下）。所以如果接收者收到以EF BB BF开头的字节流，就知道这是UTF-8编码了。</span>
</p>
<p>
<span>Windows就是使用BOM来标记文本文件的编码方式的。</span>
</p>
<h3>6、进一步的参考资料</h3>
<p>
<span>本文主要参考的资料是 &quot;Short overview of ISO-IEC 10646 and Unicode&quot; (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。</span>
</p>
<p>
<span>我还找了两篇看上去不错的资料，不过因为我开始的疑问都找到了答案，所以就没有看：</span>
</p>
<ol>
<li><span>&quot;Understanding<br />
	Unicode A general introduction to the Unicode Standard&quot;<br />
	(http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter04a)<br />
	</span></li>
<li><span>&quot;Character set encoding basics<br />
	Understanding character set encodings and legacy encodings&quot;<br />
	(http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter03)<br />
	</span></li>
</ol>
<p>
<span>我写过UTF-8、UCS-2、GBK相互转换的软件包，包括使用Windows API和不使用Windows API的版本。以后有时间的话，我会整理一下放到我的个人主页上(http://fmddlmyy.home4u.china.com)。</span>
</p>
<p>
<span>我是想清楚所有问题后才开始写这篇文章的，原以为一会儿就能写好。没想到考虑措辞和查证细节花费了很长时间，竟然从下午1:30写到9:00。希望有读者能从中受益。</span>
</p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/112/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2ME下Java代码混淆的思考 (proGuard4.2)</title>
		<link>http://wupei.j2megame.org/archives/111</link>
		<comments>http://wupei.j2megame.org/archives/111#comments</comments>
		<pubDate>Sat, 31 May 2008 16:09:13 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/111</guid>
		<description><![CDATA[最近在项目中发现,proGuard混淆忒强大了! 总结一下,对于以后的J2ME编码来讲,这样非常有利于编程,甚至是移植,效率! 1. 如果一个函数只用过一次,会自动编译进原调用函数 说明: OK,多多封装函数吧 2. 如果是final常量(非数组),会自动编译进原调用位置 说明: 用于隐藏式编程,防止出现明文代码 3. proGuard混淆的代码,经过反编译会出现这样的情况: int i=1; this = i; 说明: 是的.就是语法错误,所以说很强大!会防止反编译的!不知道为什么 4....]]></description>
			<content:encoded><![CDATA[<p>
最近在项目中发现,proGuard混淆忒强大了!
</p>
<p>
总结一下,对于以后的J2ME编码来讲,这样非常有利于编程,甚至是移植,效率!
</p>
<p>
1. 如果一个函数只用过一次,会自动编译进原调用函数<br />
说明: OK,多多封装函数吧
</p>
<p>
<span id="more-111"></span>
</p>
<p>
2. 如果是final常量(非数组),会自动编译进原调用位置<br />
说明: 用于隐藏式编程,防止出现明文代码
</p>
<p>
3. proGuard混淆的代码,经过反编译会出现这样的情况: int i=1; this = i; <br />
说明: 是的.就是语法错误,所以说很强大!会防止反编译的!不知道为什么
</p>
<p>
4. 如果一个函数未被调用过,会被除去!<br />
说明: 功能函数尽量多的写吧
</p>
<p>
5. 待续&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/111/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>自己关于手机游戏行业及开发技术的畅想</title>
		<link>http://wupei.j2megame.org/archives/110</link>
		<comments>http://wupei.j2megame.org/archives/110#comments</comments>
		<pubDate>Sat, 31 May 2008 14:43:19 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/110</guid>
		<description><![CDATA[参加实习也不算短了,总结一下,顺便给自己指明道路!&#160; 一直认为J2ME手机行业是技术门槛比较低的一个行业,但是真有这么低吗?答案应该是没有. 自己也是一直认为PC游戏的技术是最难的,最复杂的,相比Java,J2ME来说,C++也是难上加难,基于我对技术的崇拜或者什么,所以一直想转向PC游戏开发,但自从进入手机游戏部门开始实习,发现这一切应该都是表面的东西,技术低?难道就有J2ME那几个类?那几个函数吗?不是的! API越多你的工作量就越少,API越少你的工作量就越多,想C++的基本API和JAVA的基本API,C++你需要自己实现更多的东西,像DirectX与J2ME相比,J2ME你需要做更多的事情 是的,在我学Java,J2ME的时候,在毫无Java,J2ME的知识下,仅仅用了一个星期的时间,就可以完成一个图形化棋类的游戏了,相比C++来说,利用MFC做出一个像样的游戏,还是有很大的距离的,但是仔细一想,其实还是靠的我C++坚实的基础,造就了我的学习效率 在现在PC网游开发阶段,也已经看到现在开发PC网游已经不是开发游戏了,已经是开发服务器通信,或者是相关的工具,或者是图形显示,或者是3dMax插件&#8230;等等,大多数也已经从开发游戏中脱离了出来 而手机游戏呢?现在是代码量还是比较小的,但是总归是在开发游戏吧,不管是游戏的逻辑,游戏的显示也好,但已经开始向PC网游那种的形式发展了,比如游戏工具之类的东西,游戏嘛,应该都是这样的发展过程,向有利于开发人员更好的开发游戏方向发展,比如给策划用的关卡编辑器,给美术用的动画编辑器等等等 手机用户在全国用户现在也应该有4,5亿了,比PC拥有者要多得多,前景是非常好的,而且当前的手机游戏开发相比PC游戏开发就像以前的DOS下开发游戏,是基于硬件的,就像不同的手机用不同的API,不同的平台,甚至平台上的API不遵循标准,甚至是有API的BUG出现,这就是DOS时代,慢慢的就会有一个统一的平台会出现,也不知道他是什么,但是一定是会有的,就像 windows 取代 dos 一样,当时 windows 新出来的时候,很多程序员是十分摒弃 windows 的,比 dos 运行又慢,又丑陋,最终 windows 还是战胜了...]]></description>
			<content:encoded><![CDATA[<p>
参加实习也不算短了,总结一下,顺便给自己指明道路!&nbsp;
</p>
<p>
一直认为J2ME手机行业是技术门槛比较低的一个行业,但是真有这么低吗?答案应该是没有.
</p>
<p>
自己也是一直认为PC游戏的技术是最难的,最复杂的,相比Java,J2ME来说,C++也是难上加难,基于我对技术的崇拜或者什么,所以一直想转向PC游戏开发,但自从进入手机游戏部门开始实习,发现这一切应该都是表面的东西,技术低?难道就有J2ME那几个类?那几个函数吗?不是的! API越多你的工作量就越少,API越少你的工作量就越多,想C++的基本API和JAVA的基本API,C++你需要自己实现更多的东西,像DirectX与J2ME相比,J2ME你需要做更多的事情
</p>
<p>
是的,在我学Java,J2ME的时候,在毫无Java,J2ME的知识下,仅仅用了一个星期的时间,就可以完成一个图形化棋类的游戏了,相比C++来说,利用MFC做出一个像样的游戏,还是有很大的距离的,但是仔细一想,其实还是靠的我C++坚实的基础,造就了我的学习效率
</p>
<p>
<span id="more-110"></span>
</p>
<p>
在现在PC网游开发阶段,也已经看到现在开发PC网游已经不是开发游戏了,已经是开发服务器通信,或者是相关的工具,或者是图形显示,或者是3dMax插件&#8230;等等,大多数也已经从开发游戏中脱离了出来
</p>
<p>
而手机游戏呢?现在是代码量还是比较小的,但是总归是在开发游戏吧,不管是游戏的逻辑,游戏的显示也好,但已经开始向PC网游那种的形式发展了,比如游戏工具之类的东西,游戏嘛,应该都是这样的发展过程,向有利于开发人员更好的开发游戏方向发展,比如给策划用的关卡编辑器,给美术用的动画编辑器等等等
</p>
<p>
手机用户在全国用户现在也应该有4,5亿了,比PC拥有者要多得多,前景是非常好的,而且当前的手机游戏开发相比PC游戏开发就像以前的DOS下开发游戏,是基于硬件的,就像不同的手机用不同的API,不同的平台,甚至平台上的API不遵循标准,甚至是有API的BUG出现,这就是DOS时代,慢慢的就会有一个统一的平台会出现,也不知道他是什么,但是一定是会有的,就像 windows 取代 dos 一样,当时 windows 新出来的时候,很多程序员是十分摒弃 windows 的,比 dos 运行又慢,又丑陋,最终 windows 还是战胜了 dos,也战胜了其他的操作系统,最终到了我们最终用户的手中
</p>
<p>
OK,如果平台换了,API也换了,还要J2ME吗?这不白学了,NONO,不是的,作为游戏开发这个层面来讲,一切终端上的开发都是由 DOS 类似的时代转换而来的,游戏主机,比如PS,一开始也是从比如任天堂,一步一步发展而来的,而PC游戏,已经到了一个程度的,看不到他多远的路程,手机游戏缺看到有很光明的一段路程,所以作为游戏开发来讲,进入一个 dos 时代的行业,会与行业与时俱进的,平台换了,没关系,只是换了个语言,换了个工具而已,咱还可以接着干,因为咱懂, PC游戏缺不一样,因为他的开发模式已经基本成熟,如果现在PC游戏全部一直到Linux上,那上千万级别的代码怎么办呢?&#8230;&#8230;这里应该也有项目大小的问题,现在J2ME是项目较小的问题
</p>
<p>
要从手机行业出发,并非以J2ME出发,J2ME只是工具,是技巧!从全局出发,再大就是从游戏出发,从底层做起,也就是DOS时代,与时俱进是非常有前途的
</p>
<p>
而且自己的技术积累,也比PC网游的多,又有网站!转向手机游戏了! J2ME还是开源的!
</p>
<p>
个人转向好处:
</p>
<ol>
<li>技术并不简单</li>
<li>是开发游戏,不是别的</li>
<li>行业很看好,是DOS时代,与时俱进</li>
<li>用户群体多,前途看好</li>
<li>自己的技术积累多</li>
<li>J2ME开源,ant,polish,proguard出色的开源项目</li>
<li>自己的网站</li>
<li>易调试,易安装,数据量小,自己可以把握&nbsp;</li>
</ol>
<p>
注意:　纯属个人意见!&nbsp;
</p>
<p>
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&nbsp;
</p>
<p>
作为程序员:&nbsp;
</p>
<p>
在J2ME的游戏开发上,要时刻想着移植的问题,用户体验也非常得重要!程序员体验也相当重要,也就是你的代码的合理性与美观性!俗话就是良好的编程思想!
</p>
<p>
移植要使你的函数写得封装得很好,和可变化性高,以适应以后的修改
</p>
<p>
用户体验,要从每一细节的地方抓起,个人认为这是做精品游戏的一个关键点! 比如菜单选择框,有得选择框是一个循环的,在最后一个菜单,按下以后,会自动跳到第一个菜单,这就是对用户体验提高的一个小点,其实还有很多很多!以后将用专贴记录一下
</p>
<p>
开发游戏不是为了项目经理开发,更不是为了怎么赚钱开发,是为了用户体验,为了玩家开发,钱只是副产物而已&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/110/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>从根本解决 MySQL 3 数据库升级到 MySQL 4.1 乱码问题</title>
		<link>http://wupei.j2megame.org/archives/108</link>
		<comments>http://wupei.j2megame.org/archives/108#comments</comments>
		<pubDate>Sun, 18 May 2008 02:12:44 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/108</guid>
		<description><![CDATA[这两天,研究了一下mysql升级的乱码问题,终于解决了困扰我很久的问题,这里记录一下,以前相关的文章也已经更新了 以后就可以访问的更换服务器了 先来看问题描述: 开始的服务器版本: Linux + Apache2.0 + php4.4.0 + mysql3.2.3 无乱码 (SQL导出文件起始地) 开始的本地测试版本: XP + IIS5.1 + php4.4.0 +...]]></description>
			<content:encoded><![CDATA[<p>
这两天,研究了一下mysql升级的乱码问题,终于解决了困扰我很久的问题,这里记录一下,以前相关的文章也已经更新了
</p>
<p>
以后就可以访问的更换服务器了
</p>
<p>
<span style="color: #ff0000">先来看问题描述:</span>
</p>
<p>
开始的服务器版本: Linux + Apache2.0 + php4.4.0 + mysql3.2.3 无乱码 (SQL导出文件起始地)<br />
开始的本地测试版本: XP + IIS5.1 + php4.4.0 + mysql3.2.3 无乱码<br />
更新的服务器版本: Linux + Apache2.0 + php4.4.0 + mysql4.1 无乱码 (空间提供商上传)<br />
更新的本地测试版本: XP + IIS5.1 + php4.4.0 + mysql4.1 <strike>无乱码</strike>(不知道为什么,但是后来又乱码了)<br />
最新的本地测试版本: XP + Apache2.0 + php4.4.0 + mysql4.1 乱码&#8230;.崩溃..3天..未解决..
</p>
<p>
<span id="more-108"></span><span style="color: #ff0000">问题解决:</span>
</p>
<p>
首先将 sql 文件从服务器上下载下来,或者从什么地方得到这个 sql 执行文件&nbsp;
</p>
<p>
1. 使用 <span style="color: #ff0000">UltraEdit</span> 打开这个文件,观看文件是否是utf-8格式,下面的状态栏有提示,如果不是文件另存为<span style="color: #ff0000">UTF-8(无BOM)格式</span>,观看文件的中文字符,是否显示正常,显示正常OK,继续
</p>
<p>
说明: 记着是 UltraEdit ,因为这个软件支持UTF-8编码文件(其他的也可以),windows自带的记事本可能出现匪夷所思的事情,无(BOM)格式也很重要,PHP不支持BOM头&#8230; <span style="color: #ff0000">如果这里无法显示正常的话,不可能往下进行了</span>&#8230;我试过,所以说多用不同形式导出几次,使得原始数据正常
</p>
<p>
2. 如果sql文件出现,新建表指令,注意中间的 <br />
ENGINE=MyISAM DEFAULT <span style="color: #ff0000">CHARSET=latin1</span> AUTO_INCREMENT=101 ; <br />
修改为: ENGINE=MyISAM DEFAULT <span style="color: #ff0000">CHARSET=utf8 </span>AUTO_INCREMENT=101 ;
</p>
<p>
说明: 本操作就是告诉mysql表使用什么字符集
</p>
<p>
3. 新建数据库,使用&nbsp; <span style="color: #ff0000">utf8_general_ci</span>
</p>
<p>
4. 使用 phpMyAdmin 导入该文件到 mysql4, 导入的文件编码选择 <span style="color: #ff0000">UTF-8</span>
</p>
<p>
说明: 如果导入错误,看看是否出现语法错误,修改,继续导入&nbsp;
</p>
<p>
5. 使用 phpMyAdmin 浏览相关记录,观看中文记录是否显示正常,正常继续
</p>
<p>
6. 浏览你的php程序,观看,读取数据库内容,仍然乱码,在打开数据库 <span style="color: #ff0000">@mysql_connect( $host, $user, $pass )</span> 类似语句之后添加 <span style="color: #ff0000">@mysql_query(&quot;SET NAMES &#8216;utf8&#8242;&quot;);</span>
</p>
<p>
7. 刷新网页,OK,成功
</p>
<p>
<span style="color: #ff0000">说明:</span>
</p>
<ol>
<li>中间任何的过程出现错误,将导致转换失败</li>
<li>这里还有一个问题,就是现在所有的数据,前台数据,数据库数据,和传输过程的数据都用utf-8格式,所以相关的<span style="color: #ff0000">数据量</span>必然会增大,如果网页特别巨大,而且考虑到页面加载问题,可能会出现一点问题 </li>
</ol>
<p>
恩,相关的知识就不在这里细说了,我已经写在了这个博客中的&quot;<a href="http://wupei.j2megame.org/blog.php/myblog/webdev" target="_blank">网站开发</a>&quot;类别中,想了解的,可以去看看
</p>
<p>
个人感觉&#8230;很复杂&#8230; mysql,phpmyadmin,php,mysql 各个方面都会导致乱码问题&#8230;.&nbsp;
</p>
<p>
不过今天解决了,高兴的,嘿嘿
</p>
<p>
本博客和joomla站点就是使用这种方法实现转换的&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
在记录一下自己以前的思路,虽然有很多错误的,但值得思考
</p>
<p>
<strike>查得的解决途径: (对我这个问题,均未奏效)</strike> <span style="color: #ff0000">(05年5月18日删除)</span></p>
<p>&nbsp;&nbsp; 1. php配置文件php.ini问题:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似语句: default_charset = &quot;iso-8859-1&quot; 或 default_charset = &quot;UTF-8&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法: 注释掉<br />
&nbsp;&nbsp; 2. Apache配置文件httpd.conf问题:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似语句: AddDefaultCharset off 或者 AddDefaultCharset&nbsp; UTF-8<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决办法: 添加或者修改,不提倡用第二个<br />
&nbsp;&nbsp; 3. Mysql问题&nbsp; 传输过程乱码,显示乱码和结果集乱码&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类似语句: SET NAMES &#8216;utf8&#8242;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于: SET character_set_client = utf8;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET character_set_results = utf8;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET character_set_connection = utf8;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决办法: 每次SQL语句之前执行<br />
&nbsp;&nbsp; 4. phpmyadmin导入问题<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与数据库的连接校对,字符集,和导入时选择的文件字符集都有关系<br />
&nbsp;&nbsp; 5. phpmyadmin提示的两个错误<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 没有发现 PHP 的扩展设置mbstring， 而当前系统好像在使用宽字符集。没有 mbstring 扩展的 phpMyAdmin 不能正确识别字符串，可能产生不可意料的结果.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Your PHP MySQL library version 3.23.49 differs from your MySQL server version 4.1.22. This may cause unpredictable behavior.&nbsp;&nbsp; (网上查这个好像没问题)<br />
&nbsp;&nbsp; 6. XP问题: XP的文件,也就是PHP文件本身的问题&#8230;.越来越离谱好像&#8230;<strike> </strike></p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/108/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql3升级到mysql4乱码问题知识汇总(转载)</title>
		<link>http://wupei.j2megame.org/archives/109</link>
		<comments>http://wupei.j2megame.org/archives/109#comments</comments>
		<pubDate>Sat, 17 May 2008 23:14:11 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/109</guid>
		<description><![CDATA[最近解决了mysql3与mysql4的乱码问题,先共享下文章,相关文章可以在 &#34;网站开发类别&#34; 中寻找 先转载两篇文章: 均来自: http://a-wei.net/ MySQL latin1 轉 utf8 相信 MySQL 的編碼對很多人來說 &#8230; 一直是個相當令人頭痛的問題 &#8230; 今天所要做的介紹是如何把資料庫的資料, 由 latin1 轉成...]]></description>
			<content:encoded><![CDATA[<p>
最近解决了mysql3与mysql4的乱码问题,先共享下文章,相关文章可以在 &quot;<a href="http://wupei.j2megame.org/blog.php/myblog/webdev" target="_blank">网站开发类别</a>&quot; 中寻找
</p>
<p>
先转载两篇文章:
</p>
<p>
均来自: <a href="http://a-wei.net/" target="_blank">http://a-wei.net/</a>
</p>
<p>
<span style="color: #ff0000">MySQL latin1 轉 utf8</span> </p>
<p>相信 MySQL 的編碼對很多人來說 &hellip; 一直是個相當令人頭痛的問題 &hellip; 今天所要做的介紹是如何把資料庫的資料, 由 latin1 轉成 utf8..</p>
<p>一般 .. MySQL 裝起來後（用 rpm 安裝） ，系統的預設編碼是 latin1.</p>
<p>而很多人在安裝一些網頁的系統時，如 wordpress、LifeType、phpBB &hellip; 等等，都會選擇 utf8 。
</p>
<p>
<span id="more-109"></span>
</p>
<p>
這時 &hellip; 系統一樣可以正常運作 &hellip; 只是當用 phpmyadmin 進入管理資料庫時，就會發現 .. 怎麼中文字的部分都變成了歪七扭八 ..</p>
<p>或者一些鬼畫符的文字。如：????o??&hellip;?????&middot;￥???&egrave;??&egrave;&mu;&middot;</p>
<p>此現象就是 utf8 的文字以 latin1形式儲存，phpmyadmin 以 utf8 的資料讀取方式讀取 &hellip; 讀出來的資料就是這種鬼畫符&hellip;&gt;&lt;。</p>
<p>若要解決 phpmyadmin 讀出的鬼畫符 &hellip; 有兩個方法：</p>
<p>1. 進入 phpmyadmin 內一個名為 libraries 的子目錄 .. 編輯 select_lang.lib.php. 找到 $mysql_charset_map 這一段下方 ..</p>
<p>&lsquo;utf-8&prime; =&gt; &lsquo;utf8&prime;,<br />
把它改成</p>
<p>&lsquo;utf-8&prime; =&gt; &lsquo;latin1&prime;,</p>
<p>然後存檔 &hellip; 這時候就可以發現原先的鬼畫符 &hellip; 這時候又都正常了.</p>
<p>2. 把資料庫的編碼轉成 utf8 &hellip;</p>
<p>步驟：</p>
<p>a. 把資料庫 dump 出來</p>
<p>mysqldump -u xxx -p database &gt; database.sql &ndash;default-character-set=latin1</p>
<p>這時候 dump 出來的 database.sql 是 latin1 的檔案格式，然而是 utf8 的文字資料，因此這時若用 vi 開檔看它 &hellip;</p>
<p>還是會發現中文字是鬼畫符 &hellip; 這時不要被眼前的假象所騙 &hellip; 以為自己做錯 .. 幾接著做下一步驟。</p>
<p>b. 把 dump 出來的 database.sql 下載回去 .. 用 emEditor（網路上可免費下載，是個支援 utf-8 的編輯器）把 database.sql 打開，</p>
<p>它可以正常識別 utf8 的文字 ..用取代的功能，把 latin1 都取代成 utf8 ，之後直接另存新檔 .. 這時把檔案類型設定儲存成 UTF-8。</p>
<p>c. 再把 database-utf8.sql 上傳到 server .. 這時我們用 vi 開啟它 .. 就可以看見是正常的中文字 .. 這就表示檔案沒問題囉。</p>
<p>d. 把檔案匯入資料庫</p>
<p>mysql database &lt; database-utf8.sql -u xxx -p &#8211;default-character-set=utf8<br />
如果資料量不是很大 &hellip; 那麼很快就可以完成這個步驟 .. 這時候若沒有錯誤訊息出現 .. 那麼恭喜你 ..</p>
<p>你已經完成了資料庫轉換的工作了。如果有錯誤訊息出現 .. 主要有兩個情形 ..</p>
<p>1. 文件檔內的中文字，用 vi 看是亂碼 ..文件檔的格式不是 utf-8。</p>
<p>2. 匯入的時候漏掉指定採用 utf8 的資料編碼匯入。</p>
<p>以上的作業是在 資料庫系統都是處於 latin1 的環境底下，也就是沒有在 my.cnf 指定 default-character-set=utf8。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
你好,<br />
我上去看了，是個 phpMyAdmin 的管理介面，這是代管系統嗎？<br />
mysql 預設的編碼是 latin1_swedish_ci.</p>
<p>因此建議你，直接修改 phpMyAdmin 的預設編碼，改成 latin1。<br />
而不要修改資料庫編碼。</p>
<p>因為即使你修改了資料庫編碼，但資料庫連線的編碼還是會使用 latin1.<br />
到時你會落的兩邊都不是。</p>
<p>mysql 資料庫的編碼系統有三種類型。<br />
1. 前端資料編碼 （網頁）<br />
2. 資料庫連線編碼（網頁與資料庫的連線）<br />
3. 資料庫儲存編碼（把資料儲存在資料庫內的編碼）</p>
<p>你現在的情況應該是這樣.<br />
1. utf-8<br />
2. latin1<br />
3. utf8</p>
<p>前端資料是 utf-8 的編碼，但是在資料庫連線建立後轉成了 latin1 ，再儲存在 utf8 的資料庫內，因此存在 utf8資料庫內的「資料」是 latin1 編碼，而不是 utf8。</p>
<p>phpMyadmin 的管理程式的設定值是這樣</p>
<p>1. utf-8<br />
2. utf8<br />
3. don&rsquo;t care<br />
這也就是我前面所說得第一個方法，改 phpMyadmin 的編碼，指的就是改第2項。</p>
<p>要把第2項也改成 utf8 編碼的話，必需要在程式內 mysql_connect() 之後接著下這個命令「@mysql_query(&rsquo;SET NAMES UTF8&prime;)」<br />
這是在你無法變更 mysql 系統的預設編碼狀態下，唯一能夠使用的方法。<br />
也就是說，到時你要更改你 blog 系統內的資料庫連線，把這段程式碼加上去，才能完整的使用 utf8。</p>
<p>但是 &hellip; 如果現在就貿然的把 wordpress 資料庫連線編碼變更，新寫入的資料在phpMyadmin 會看的見正常編碼，但是舊的還是「亂碼」 ?</p>
<p>這也就是為什麼我會說，要先把資料庫的資料轉碼。<br />
而轉碼的方法就是 telnet 或 ssh 到 server.. 直接下命令把資料庫 dump 出來，<br />
轉碼之後再回存資料庫。</p>
<p>之後編輯 wordpress 目錄內的 wp-include\wp-db.php 這個檔案。<br />
找到「<br />
$this-&gt;dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);」<br />
在它下方加入這一行 ..<br />
@mysql_query(&rdquo;SET NAMES UTF8&Prime;);</p>
<p>然後儲存。<br />
以上的程序可能很繁瑣，建議你比較簡單的方式是 wordpress 資料庫刪除重建，重新開始。<br />
先把這行修正資料庫連線的語法加進去，就不用理會轉碼了。</p>
<p>case close.
</p>
<p>
&nbsp;
</p>
<p>
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
<span style="color: #ff0000">乱码出现的一种情况</span>(但非mysql3到mysql4乱码问题) </p>
<p>这种问题一般出现在服务器或mysql配置不当,甚至本身网页程序有问题,但关注一下也比较好
</p>
<p>
很多时候，浏览器并不按照指定的编码来显示页面。 导致乱码。其实这和http头中的内容协商机制有关系： Content-Type:<br />
text/html; charset=utf-8 当http头中有这一行的时候，浏览器总是按照这个头指示的编码来显示页面内容，而忽略<br />
tag中的设置。如果Meta和Content-Type<br />
的charset一致时，一切都是正常的，而一旦不一样，那就会出现问题。而apache本身是可以通过AddDefaultCarset<br />
XXX来来设置 http头中的默认字符编码，但是当apache和php在一起的时候，还有一个设置会影响这个http头的默认编码：<br />
default_charset = &ldquo;utf-8&Prime; 而这个default_charset<br />
的设置会覆盖apache的AddDefaultCarset配置，当然也可以在每个php里面手动调用<br />
header(&rdquo;content-type:text/html; charset=xxx&rdquo;) 来覆盖default_charset<br />
的值，这么看来一共有四个地方 会对php的执行结果产生影响： 优先级别从高到低：<br />
php的header(&rdquo;content-type:text/html; charset=xxx&rdquo;)函数<br />
php.ini里面的default_charset 设置 httpd.conf<br />
中的AddDefaultCarset设置最后才是html代码中的：META tag<br />
其实最简单的办法是把php.ini中的default_charset和httpd.conf中的AddDefaultCarset置空。通过Meta<br />
tag来指定编码，header只是临时性的改变编码的最后关口。&nbsp;
</p>
<p>
&nbsp;
</p>
<p>
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&nbsp;
</p>
<p>
<span style="color: #ff0000"><br />
[转载]apache+php 乱码问题解决</span> 个人认为这个也不是mysql3-mysql4乱码问题,跟第一类相同
</p>
<p>
转载自：<a href="http://hi.baidu.com/rebeccapih/blog/item/9feb28f49718c3daf3d385d5.html">忘忧草</a>
</p>
<p>
如果你在网上搜索 &ldquo;apache配置&rdquo;，搜到的页面大多都会建议你在httpd.conf中加上这么一句：AddDefaultCharset GB2312。对于新手而且是只用GB2312编码的开发人来说，这么做是ok的。
</p>
<p>
但是如果要想使用UTF-8字符集的话，比如 在test.php文件中需要有<br />
meta http-equiv=&rdquo;Content-Type&rdquo; content=&rdquo;text/html; charset=UTF-8&Prime;<br />
这段代码。这时你再打开浏览器访问test.php页面的话，你看到的是正确的页面。但是如果实际上浏览器还是以GB2312编码解释从服务器返回的<br />
response，为什么呢？原因是浏览器是根据http应答消息头部中的 Content-type: text/html;<br />
charset=GB2312 来决定使用何种编码解释应答，也就是说apache服务器仍然用GB2312编码传递数据。
</p>
<p>
所以说如果apache的默认字符集被设置成了GB2312，即使在页面中声明使用UTF-8编码，apache服务器还是会按照GB2312编码来传送http response。
</p>
<p>
没关系，我们把AddDefaultCharset GB2312 改成 AddDefaultCharset<br />
UTF-8，看看什么结果？如果你看到乱码恭喜你，你还知道是乱码问题；如果你看到是空白页面，那么你就惨了，你可能会以为这是其他什么原因造成的，而不<br />
会从编码的角度去考虑怎么解决问题。这是为什么？<br />
<span></span><br />
原因在于php文件本身是用系统字符集来编码的，中文的windows<br />
XP都是用GB2312，每一个文件头部都有字段指示该文件是用何种方式编码的。当apache接到浏览器的请求后，会让php去解释所请求的页面，比如<br />
test.php。php会识别出test.php的编码方式是GB2312后(就像我们用javac编译java源文件时，编译器默认用系统编码读源文<br />
件里的内容。如果源文件不是用系统编码来保存的，可以用命令javac<br />
-encoding指定具体的编码)，把数据以GB2312的编码格式传递给apache，而apache服务器不会改变从php传来的数据，只是在应答<br />
消息头部中把字符集设置成UTF-8： Content-type: text/html; charset=UTF-8.<br />
也就是说你传递的是GB2312编码的数据，而浏览器却以UTF-8编码来解释应答消息。
</p>
<p>
由于UTF-8为3个字节表示一个汉子，而普通的GB2312或BIG5是两个。页面输出时，由于上述原因，出现半个汉字的情况，这时该半个汉字会<br />
和的 &gt;结合成一个乱码字，导致IE无法读完的话，会发现实际上整个叶面全部已经输出了。如果使用的是Mozilla、Mozilla<br />
Firefox、Sarafi的浏览器这不会造成这个问题，而是一堆乱码。这是由于Firefox浏览器和IE解析网页编码的策略不同产生的。
</p>
<p>
OK,我们把test.php以UTF-8保存，再用浏览器访问时，就没有问题了。可这样做，会使得apache目录下的所有web应用只能用同一种编码。如何搞定？
</p>
<p>
解决办法：
</p>
<p>
首先，可以使用AddDefaultCharset<br />
off来关闭默认文件编码，这样apache服务器就不会在http应答消息头部设置charset，只是设置Content-type:<br />
text/html.<br />
而浏览器就会依靠html文件中设置的harset来决定编码。其次，脚本php.ini文件中的default_charset =<br />
&ldquo;UTF-8&Prime;作用同httpd.conf文件，把该行注释掉，使php自动识别文件的编码方式。
</p>
<p>
这样不论你用什么编码方式，只要test.php中的<br />
meta http-equiv=&rdquo;Content-Type&rdquo; content=&rdquo;text/html; charset=UTF-8&Prime; 与你test.php文件编码方式相同，就不会产生乱码问题。
</p>
<p>
用户提交数据的编码
</p>
<p>
浏览器提交的字符编码由客户端的characher<br />
encoding决定。例如，当前浏览器的编码是Gb2312，用户提交数据后，无论apache设置的编码方式是GB2312还是UTF-8，这时在服<br />
务器端接收到的仍是以Gb2312编码的数据。如果要在返回页面上显示用户刚才提交的数据，而该页面是用UTF-8编码的，或者要在数据库中存储的用户提<br />
交的数据，而数据库是UTF-8编码的，那就要做字符转换了。
</p>
<p>
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/109/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言的强大(C语言实现异常机制)</title>
		<link>http://wupei.j2megame.org/archives/107</link>
		<comments>http://wupei.j2megame.org/archives/107#comments</comments>
		<pubDate>Sat, 10 May 2008 20:04:33 +0000</pubDate>
		<dc:creator>Wupei</dc:creator>
		
		<guid isPermaLink="false">http://wupei.j2megame.org/107</guid>
		<description><![CDATA[一直知道C很强大,可以编写操作系统等等,但是一直没有概念 今天看了一下KVM的CLDC1.1的源代码,太酷了,一切都是C,加载class,运行class,类多态实现&#8230;..加载JAR,运行JAR&#8230;.实现线程&#8230;..还包括实现了异常机制,好强大! 下载地址: j2megame.cn下载 一切的一切,继续学习&#8230;..距离&#8230;. 虽然看不懂,但记录一下实现的,看代码 global.h (异常的实现) /* * There must not be any allocation guard active when entering...]]></description>
			<content:encoded><![CDATA[<p>
一直知道C很强大,可以编写操作系统等等,但是一直没有概念
</p>
<p>
今天看了一下KVM的CLDC1.1的源代码,太酷了,一切都是C,加载class,运行class,类多态实现&#8230;..加载JAR,运行JAR&#8230;.实现线程&#8230;..还包括实现了异常机制,好强大!
</p>
<p>
下载地址: <a href="http://www.j2megame.cn/bbs/viewthread.php?tid=3781&amp;extra=page%3D1" target="_blank">j2megame.cn下载</a>
</p>
<p>
一切的一切,继续学习&#8230;..距离&#8230;.
</p>
<p>
虽然看不懂,但记录一下实现的,看代码
</p>
<p>
<span id="more-107"></span>
</p>
<p>
global.h (异常的实现)
</p>
<pre c>/*
 * There must not be any allocation guard active when entering a TRY block
 * as an exception throw will always cause at least one allocation (for the
 * exception object) thus potentially invalidating any pointers being
 * guarded by the allocation guard. Note however that this does not preclude
 * using an allocation guard inside a TRY block.
 */
#define ASSERT_NO_ALLOCATION_GUARD \
    if (NoAllocation &gt; 0) { \
        fatalError(KVM_MSG_TRY_BLOCK_ENTERED_WHEN_ALLOCATION_FORBIDDEN); \
    }
#else
#define TRACE_EXCEPTION(name)
#define ASSERT_NO_ALLOCATION_GUARD
#endif

#define TRY                                                    \
    {                                                          \
        struct throwableScopeStruct __scope__;                 \
        int __state__;                                         \
        jmp_buf __env__;                                       \
        __scope__.outer = ThrowableScope;                      \
        ThrowableScope = &amp;__scope__;                           \
        ThrowableScope-&gt;env = &amp;__env__;                        \
        ThrowableScope-&gt;tmpRootsCount = TemporaryRootsLength;  \
        ASSERT_NO_ALLOCATION_GUARD                             \
        TRACE_EXCEPTION("TRY")                                 \
        if ((__state__ = setjmp(__env__)) == 0) {

/*
 * Any non-null THROWABLE_INSTANCE passed into a CATCH clause
 * is protected as a temporary root.
 */
#define CATCH(__throwable__)                                   \
        }                                                      \
        TRACE_EXCEPTION("CATCH")                               \
        ThrowableScope = __scope__.outer;                      \
        TemporaryRootsLength = __scope__.tmpRootsCount;        \
        if (__state__ != 0) {                                  \
            START_TEMPORARY_ROOTS                              \
                 DECLARE_TEMPORARY_ROOT(THROWABLE_INSTANCE,    \
                     __throwable__,__scope__.throwable);

#define END_CATCH                                              \
            END_TEMPORARY_ROOTS                                \
        }                                                      \
    }

/*
 * This macro is required for jumping out of a CATCH block with a goto.
 * This is used in FastInterpret so that the interpreter loop is re-entered
 * with a fresh TRY statement.
 */
#define END_CATCH_AND_GOTO(label)                              \
            END_TEMPORARY_ROOTS                                \
            goto label;                                        \
        }                                                      \
    }

#define THROW(__throwable__)                                   \
    {                                                          \
        THROWABLE_INSTANCE __t__ = __throwable__;              \
        TRACE_EXCEPTION("THROW")                               \
        if (__t__ == NULL)                                     \
            fatalVMError("THROW called with NULL");            \
        ThrowableScope-&gt;throwable = __t__;                     \
        longjmp(*((jmp_buf*)ThrowableScope-&gt;env),1);           \
    }</pre>
<p>
class.c (异常的使用)
</p>
<pre c>/*===========================================
 * FUNCTION:      initializeClass()
 * TYPE:          constructor
 * OVERVIEW:      After loading a class, it must be initialized
 *                by executing the possible internal static
 *                constructor '&lt;clinit&gt;'. This will initialize the
 *                necessary static structures.
 *
 *                This function sets up the necessary Class.runClinit
 *                frame and returns to the interpreter.
 * INTERFACE:
 *   parameters:  class pointer
 *   returns:     &lt;nothing&gt;
 *===========================================*/

void initializeClass(INSTANCE_CLASS thisClass)
{
    if (thisClass-&gt;status == CLASS_ERROR) {
        raiseException(NoClassDefFoundError);
    } else if (thisClass-&gt;status &lt; CLASS_READY) {
        if (thisClass-&gt;status &lt; CLASS_VERIFIED) {
            verifyClass(thisClass);
        }
        /*
         * VerifyError will have been thrown or status will be
         * CLASS_VERIFIED. We can skip execution of &lt;clinit&gt; altogether if
         * it does not exists AND the superclass is already initialised.
         */
        if ((thisClass-&gt;superClass == NULL ||
            thisClass-&gt;superClass-&gt;status == CLASS_READY) &amp;&amp;
            getSpecialMethod(thisClass,clinitNameAndType) == NULL) {
            setClassStatus(thisClass,CLASS_READY);
        }
        else {
            TRY {
                pushFrame(RunCustomCodeMethod);
                pushStackAsType(CustomCodeCallbackFunction, &amp;runClinit);
                pushStackAsType(INSTANCE_CLASS, thisClass);
                pushStackAsType(long, 1);
            } CATCH (e) {
                /* Stack overflow */
                setClassStatus(thisClass, CLASS_ERROR);
                THROW(e);
            } END_CATCH
        }
    }
}</pre>
<p>
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://wupei.j2megame.org/archives/107/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

