??xml version="1.0" encoding="utf-8" standalone="yes"?> 我们在解决中文问题的时候,用到的最多的一个词是UTF-8。我们知道ASCII码是单字节编码方式,可以解决英文的问题,但是中文的字库非常庞大,用ASSII码就难以解决?jin)。Java语言是支持UNICODE~码方式的,UNICODE是双字节的编码方式可以支持中文字库,但是q多带来一些浪费,因ؓ(f)q不是所有的字符串都是非英文字符的。UTF-8~码方式正好可以解决q个问题Q只有当字符不是ASSII码的时候他采用双字节来表示Q这样就节省?jin)空间。这里我只ȝ?jin)三UJ2ME常见的中文问题?/P> } catch (IOException e)
J2me游戏~程随书源码
]]>
]]>
http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm
]]>
http://www.aygfsteel.com/Files/konhon/WordTip.rar
錄入完後供查?
適用midp1.0的手?
軟g截圖:
]]>
Java的中文问题通常?x)困扰很多开发者,你可能在开发Web应用E序的时候遇C文参数的传递问题,最后你可能选择使用Filter把Request的编码方式设|ؓ(f)GBK来解冟뀂在J2ME的开发中我们同样?x)遇C文问题,比如在RMS中存储中文、网l传输中传输中文、从文g中读取中文等问题?
|络传输中的中文问题
解决q个问题的关键是我们不采用InputStream或者OutputStream提供的方法按照字节来传递数据,而是把InputStream或者OutputStream装为DataInputStream和DataOutputStream。这h们就可以使用DataOutputStream中的writeUTF(String s)来送出数据?jin),同时可以使用DataInputStream提供的readUTF()来读入数据。注意在q两个方法搭配用的时候要注意序。比如我们在联网的时候可能写?gu)L(fng)代码
客户?BR> dos.writeInt(myint);
dos.writeByte(mybyte);
dos.writeUTF(myString);
服务器端
int i = dis.readInt();
byte b = dis.readByte();
String s = dis.readUTF();
RMS持久性存储的中文问题
׃RMS中的数据存储都是按照byte[]的格式存储的Q因此我们需要稍微变化一下,但是基本上还是走UTF-8的思\?BR>
写入数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeUTF(myString);
byte[] data = baos.toByteArray();
rs.addRecord(data,0,data.length);
d数据
byte[] data = rs.getRecord(index);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
String myString = dis.readUTF();
d中文文g的问?BR>在MIDP中ƈ不支持文件系l,但是我们可以djar包中的文件。如果文件中含有中文Q那么我们需要进行一些特D的处理Q首先我们用UE或者Notepad工具把相关的文g转换文UTF-8格式~码。我们在d文g的时候需要进行如下的单处理。下面是处理函数?BR>
public String readFromFile(String fileName)
{
String returnString = null;
InputStream is = getClass().getResourceAsStream(fileName);
if (is != null)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch = 0;
try
{
while ((ch = is.read()) != -1)
{
baos.write(ch);
}
byte[] data = baos.toByteArray();
returnString = new String(data, "UTF-8");
is.close();
baos.close();
{
e.printStackTrace();
}
}
return returnString;
}
]]>
]]>
轉換例子如下:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
public class FriendData
{
String name;
String tel;
boolean sex;
int age;
public FriendData()
{
name = "NO NAME";
tel = "NO TEL";
sex = false;
age = 0;
}
public byte[] encode()
{
byte[] result = null;
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(name);
dos.writeUTF(tel);
dos.writeBoolean(sex);
dos.writeInt(age);
result = bos.toByteArray();
dos.close();
bos.close();
} catch (Exception e)
{
}
return result;
}
public void decode(byte[] data)
{
try
{
ByteArrayInputStream bis = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bis);
name = dis.readUTF();
tel = dis.readUTF();
sex = dis.readBoolean();
age = dis.readInt();
dis.close();
bis.close();
} catch (Exception e)
{
}
}
}
]]>import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class LLEventMIDlet extends MIDlet
{
private Display display;
public LLEventMIDlet()
{
super();
display = Display.getDisplay(this);
// TODO Auto-generated constructor stub
}
protected void startApp() throws MIDletStateChangeException
{
// TODO Auto-generated method stub
MyCanvas mc = new MyCanvas();
display.setCurrent(mc);
}
protected void pauseApp()
{
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
// TODO Auto-generated method stub
}
private class MyCanvas extends Canvas
{
String action = "";
public void paint(Graphics g)
{
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 0, 0);
if (hasRepeatEvents())
{
g.drawString("Repeat", 10, 10, 0);
} else
{
g.drawString("NonRepeat", 10, 10, 0);
}
g.drawString(action, 10, 20, 0);
}
protected void keyPressed(int keyCode)
{
action = "KP: " + (char)keyCode;
repaint();
}
protected void keyReleased(int keyCode)
{
action = "KR: " + (char)keyCode;
repaint();
}
protected void keyRepeated(int keyCode)
{
action = "KRe: " + (char)keyCode;
repaint();
}
}
}
在MIDP 1.0 規格中,Canvas 別裡頭定義?jin)幾個常數,他們分
別是Q?KEY_NUM0 、KEY_NUM1 、KEY_NUM2 、KEY_NUM3 、KEY_NUM4 、KEY_NUM5 、KEY_NUM6 、KEY_NUM7 、KEY_ NUM8 、KEY_NUM9 、KEY_STAR、KEY_POUND ?1 個,分別代表0~9 的數字鍵、星號鍵、以?qing)井號鍵。我們可以利用這幾個常數判定鍵盤(按鈕Q事件處理函式所傳進來的keyCodeQ藉以了(jin)解哪個按鈕被按下?jin),當然Q除?jin)這些按鍵之外Q其他的按鍵也會有其應|(zhn)必須自己嘗試找ZQ但是為?jin)可以跨q_Q徏議?zhn)僅只使用這些標準的定鍵?BR>
Z(jin)Game a計師的方便QMIDP 1.0 規格中,Canvas 別裡頭定義?jin)幾個與Game 늛代碼盔R的常數,他們分別是UP、DOWN、LEFT、RIGHT、FIRE、GAME_A、GAME_B、GAME_C、GAME_D。這些定義雖然很可能會和之前的定義有所重複Q但是因為有?jin)一層抽象性,在移植的時候也方便多?jin)?BR>
那麼Q在E式裡頭該如何處理呢? Canvas 裡頭提供?jin)兩個函?
1. getGameAction() 傛_keyCodeQ函式會回傳所代表?BR>Game 늛代碼?BR>用法如下Q?BR>
public void keyPressed(int keyCode)
{
switch(getGameAction(keyCode))
{
case Canvas.LEFT:
moveLeft() ;
break ;
case Canvas.FIRE:
fire() ;
break ;
?IMG src="http://www.aygfsteel.com/images/dot.gif">
}
}
2. getKeyCode() 傛_Game 늛代碼Q函式會回傳所代表?BR>keyCode?BR>用法如下Q?BR>
public void keyPressed(int keyCode)
{
if(keyCode == getKeyCode(Canvas.LEFT))
{
moveLeft() ;
}else if(keyCode == getKeyCode(Canvas.FIRE))
{
fire() ;
}
?IMG src="http://www.aygfsteel.com/images/dot.gif">
}
]]>
1. 先比較每個Command 物g的命令型態,優先順序高的越先出現?BR>在Command 物g之中共定了(jin)八種命o(h)型態Q從優先順序最高到最低列表如下:(x)
Command.BACK
Command.CANCEL
Command.EXIT
Command.HELP
Command.ITEM
Command.OK
Command.SCREEN
Command.STOP
2. 如果命o(h)型態相同Q就比較其優先權Q設定D低的先出現?BR>
3. 如果優先Ɗ相同,׃利用addCommand()加入畫面的先後順序決定?BR>
]]>
转蝲自:(x)www.csdn.net
javaE序昄中文是大安遇到q的问题Q尤其是JAD文g的中文问题,一般都用native2ascii工具转换Q这里收藏了(jin)native2ascii工具的详l说明:(x)
native2ascii - Native-to-ASCII Converter
Converts a file with native-encoded characters (characters which are non-Latin 1 and non-Unicode) to one with Unicode-encoded characters.
SYNOPSIS
native2ascii [options] [inputfile [outputfile]]
DESCRIPTION
The Java compiler and other Java tools can only process files which contain Latin-1 and/or Unicode-encoded (\udddd notation) characters. native2ascii converts files which contain other
character encodings into files containing Latin-1 and/or Unicode-encoded charaters.
If outputfile is omitted, standard output is used for output. If, in addition, inputfile is
omitted, standard input is used for input.
OPTIONS
-reverse
Perform the reverse operation: convert a file with Latin-1 and/or Unicode encoded characters to one with native-encoded characters.
-encoding encoding_name
Specify the encoding name which is used by the conversion procedure.
The default encoding is taken from System property file.encoding.
The encoding_name string must be a string taken from the first column of the table
below.
-------------------------------------------------------------
Converter Description
Class
-------------------------------------------------------------
8859_1 ISO 8859-1
8859_2 ISO 8859-2
8859_3 ISO 8859-3
8859_4 ISO 8859-4
8859_5 ISO 8859-5
8859_6 ISO 8859-6
8859_7 ISO 8859-7
8859_8 ISO 8859-8
8859_9 ISO 8859-9
Big5 Big5, Traditional Chinese
CNS11643 CNS 11643, Traditional Chinese
Cp037 USA, Canada(Bilingual, French), Netherlands,
Portugal, Brazil, Australia
Cp1006 IBM AIX Pakistan (Urdu)
Cp1025 IBM Multilingual Cyrillic: Bulgaria, Bosnia,
Herzegovinia, Macedonia(FYR)
Cp1026 IBM Latin-5, Turkey
Cp1046 IBM Open Edition US EBCDIC
Cp1097 IBM Iran(Farsi)/Persian
Cp1098 IBM Iran(Farsi)/Persian (PC)
Cp1112 IBM Latvia, Lithuania
Cp1122 IBM Estonia
Cp1123 IBM Ukraine
Cp1124 IBM AIX Ukraine
Cp1125 IBM Ukraine (PC)
Cp1250 Windows Eastern European
Cp1251 Windows Cyrillic
Cp1252 Windows Latin-1
Cp1253 Windows Greek
Cp1254 Windows Turkish
Cp1255 Windows Hebrew
Cp1256 Windows Arabic
Cp1257 Windows Baltic
Cp1258 Windows Vietnamese
Cp1381 IBM OS/2, DOS People's Republic of China (PRC)
Cp1383 IBM AIX People's Republic of China (PRC)
Cp273 IBM Austria, Germany
Cp277 IBM Denmark, Norway
Cp278 IBM Finland, Sweden
Cp280 IBM Italy
Cp284 IBM Catalan/Spain, Spanish Latin America
Cp285 IBM United Kingdom, Ireland
Cp297 IBM France
Cp33722 IBM-eucJP - Japanese (superset of 5050)
Cp420 IBM Arabic
Cp424 IBM Hebrew
Cp437 MS-DOS United States, Australia, New Zealand,
South Africa
Cp500 EBCDIC 500V1
Cp737 PC Greek
Cp775 PC Baltic
Cp838 IBM Thailand extended SBCS
Cp850 MS-DOS Latin-1
Cp852 MS-DOS Latin-2
Cp855 IBM Cyrillic
Cp857 IBM Turkish
Cp860 MS-DOS Portuguese
Cp861 MS-DOS Icelandic
Cp862 PC Hebrew
Cp863 MS-DOS Canadian French
Cp864 PC Arabic
Cp865 MS-DOS Nordic
Cp866 MS-DOS Russian
Cp868 MS-DOS Pakistan
Cp869 IBM Modern Greek
Cp870 IBM Multilingual Latin-2
Cp871 IBM Iceland
Cp874 IBM Thai
Cp875 IBM Greek
Cp918 IBM Pakistan(Urdu)
Cp921 IBM Latvia, Lithuania (AIX, DOS)
Cp922 IBM Estonia (AIX, DOS)
Cp930 Japanese Katakana-Kanji mixed with 4370 UDC,
superset of 5026
Cp933 Korean Mixed with 1880 UDC, superset of 5029
Cp935 Simplified Chinese Host mixed with 1880 UDC,
superset of 5031
Cp937 Traditional Chinese Host miexed with 6204 UDC,
superset of 5033
Cp939 Japanese Latin Kanji mixed with 4370 UDC,
superset of 5035
Cp942 Japanese (OS/2) superset of 932
Cp948 OS/2 Chinese (Taiwan) superset of 938
Cp949 PC Korean
Cp950 PC Chinese (Hong Kong, Taiwan)
Cp964 AIX Chinese (Taiwan)
Cp970 AIX Korean
EUCJIS JIS, EUC Encoding, Japanese
GB2312 GB2312, EUC encoding, Simplified Chinese
GBK GBK, Simplified Chinese
ISO2022CN ISO 2022 CN, Chinese
ISO2022CN_CNS CNS 11643 in ISO-2022-CN form, T. Chinese
ISO2022CN_GB GB 2312 in ISO-2022-CN form, S. Chinese
ISO2022KR ISO 2022 KR, Korean
JIS JIS, Japanese
JIS0208 JIS 0208, Japanese
KOI8_R KOI8-R, Russian
KSC5601 KS C 5601, Korean
MS874 Windows Thai
MacArabic Macintosh Arabic
MacCentralEurope Macintosh Latin-2
MacCroatian Macintosh Croatian
MacCyrillic Macintosh Cyrillic
MacDingbat Macintosh Dingbat
MacGreek Macintosh Greek
MacHebrew Macintosh Hebrew
MacIceland Macintosh Iceland
MacRoman Macintosh Roman
MacRomania Macintosh Romania
MacSymbol Macintosh Symbol
MacThai Macintosh Thai
MacTurkish Macintosh Turkish
MacUkraine Macintosh Ukraine
SJIS Shift-JIS, Japanese
UTF8 UTF-8
不过WTK可以直接解决JAD的中文问题:(x)
settings>MidLets>MidLet-1属性改成你惌昄的中文后重新生成JAD和JAR文g卛_?BR>
]]>
一Q代码优?/B>
内存?x)溢(gu)定和代码逃不?jin)关p?99.99%学java的h都知道垃圑֛收器是java的一大优点ƈ据此来嘲WC++。显然这个特性ؓ(f)代码~写者省?jin)不事Q但q个Ҏ(gu)却带来?jin)不隐?zhn)。D个例子在游戏当中l常有不同场景的切换Q如从游戏逻辑退C菜单逻辑,Ҏ(gu)戏逻辑对象的态度很多Z(x)选择忘记{待垃圾回收器来收尸^_^。乍看之下似乎ƈ无不妥垃圑֛收器?x)来善后。实际上垃圾回收器ƈ非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换C菜单逻辑q时两个对象同时存在很可能这时内存就不够用了(jin)。读到这里很多h?x)发现实际上垃圾回收器在j2me上ƈ不怎么好用Q从一个角度上来讲在j2me上所有垃圑ֿȝ手工释放,除简单类型以外所有对象都必须昑ּ地置IZ?imgs=null; 实际上java提供?jin)一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以q回当前的剩余内存数Q将它适当的安攑֜代码中可以有效的监测内存使用状况。很大一部䆾的j2meE序员之前都是从事pc软g开发工作,充裕的内存掩盖了(jin)许多写代码的不良?fn)惯。如下所C?
//a 不ؓ(f)I?BR>a=new Logic();
很多人可能对此有异议Q他们会(x)认ؓ(f)新的对象?x)把旧的对象冲掉q且释放内存。这里面包含两个问题Q?. 该段代码是先创徏对象然后再进行赋值操作的Q也是说在q期间有两个对象同时存在q就很可能会(x)产生溢出?. q样做也?x)妨垃圑֛收器的工?BR>较好的写法如?
a=null;
a=new Logic();
虽然ȝ(ch)?jin)点但在j2me中还是必要的。接着看下例?BR>drawString("游戏旉:" + time ,50,50,Graphics.LEFT|Graphics.TOP);
"游戏旉:" + time 很完在paint()Ҏ(gu)当中每次都被刷一遍显C在屏幕上。危机往往隐藏在美丽的外表Q该语句?x)引h的内存重新分配来存储 "游戏旉:" + time 而显C完以后又必ȝ垃圾回收器释放,用了(jin)双倍时?q且Ҏ(gu)发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()Ҏ(gu)cM在@环里也有cM的情况存在?
把所有对象的初始化放在构造函数里惛_是再正当不过?大多Ch通常的做法是把当前逻辑所要用到的资源通通初始化完毕?BR>很大一部䆾的内存溢出都是发生在构造函C。内存用的高峰期都是在构造函C所以避开q个高峰能有效的防止溢出。徏议最好的办法是第一ơ用时初始化。如下所C?BR>if (img==null){
//初始?BR>}
现在做游戏很多时候都需要地图数l,声音数组Q还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中?BR>强烈这些资源放在文件中需要时在loadq来。这些资源文件如果放在代码中则会(x)占用不小的代码段I间Q而代码一般是E序一q行p载到内存当中?BR>除上面列丄Ҏ(gu)外还有一些大家所熟知的顺便一? 比如关闭没用的rms Q关闭没用的|络q接Q关闭没用的。正地停止U程。良好的E序架构减少代码偶合性也是一个不错的Ҏ(gu)Q无论在代码调式Q内存释N可以做到非常清析?BR>
? 囄优化
j2me的内存杀手无疑非囄莫属,一?k的图片可以占?0多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从囄入手?BR>1Q图片压~? 多数人马上会(x)惛_q个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储?Q而是选择 "存储?web 所用格? 可以Ҏ(gu)里面的选项q行压羃Q特别是颜色q一越越好不q相应的囑փ?x)有所q。不要认样就完了(jin)?BR>实际上该囄q可以再ơ压~,在网上有许多cM的工兗推荐一Ƒ֏以压~png格式的Y?xat.com Image Optimizer 效果不错。经帔R?70% 的压~率且图像不?x)失真?BR>假如你有多张规格一L(fng)囄Q那么徏议你把它做成一张长条图片。有两个原因Q?
1?q样节省存储I间和内存空间。大家可做个试验?0张图片的内容攑֜一张当中对比看看文件大有没有变化?BR>2 ?0张图片需?0个image 对象需要进?0ơio操作费旉不说q浪费内存。当W者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出?..原因惛_大家也知?Q图片太大了(jin)不要把不同界面的囄整合在一起否则经怼(x)得不偿失?BR>作图时还有一些细节需要注?颜色数量Q分辩率Q图像模式(最好是索引颜色),d大小都会(x)影响到图片大?BR>
三. 工具优化
谁都知道h器是用来保护代码的以加大反编译的隑ֺ(个h认ؓ(f)q是在嘲W程序员的智商)(j)。实际上用它来优化程序也是不错的选择Q至有两点好处Q??压羃E序大小。一?0k的程序经常可以压?0k左右?0k的空间对于写低端手机的程序员直是雪中送碳Q多超q?4k限制的游戏都受过它的恩惠Q?、节省内存空间。用脚去想也惛_出来代码了(jin)内存里的代码D自然就短了(jin)?BR>Ҏ(gu)l验很多人都?x)用jb自带的淆器RetroGuardQ实际上它效果ƈ不怎么好。推荐用proguard ?http://sf.net 可以免费下蝲Q它可以比retroguard 多压~?? k 以上而且安全性更好?BR>
]]>
eclipse 3.0.1, eclipseme0.4.0安裝一切正?
安裝後便依照E上寫了(jin)一個HelloWorldE序, 運行,怪事Z? 模似器一?馬上又自動關閉啦. 看不到效?
今天早上反把eclipse換成3.1? eclipseme換成1.1.0? 再試? 問題居然解決? 郁?zhn)呀, Java這東西老是怪問? 而且大多敔R版本不兼Ҏ(gu)引v? 開源這東襉K然好, 可是這開源程序之間的兼容可是個大問題.