最近在做一個手機電子書的程序。發現按傳統的字符串分割方法(即每行可以顯示的文字寬度拆分)英文一個單詞會被拆分到兩行,看著特別不舒服。而純粹的按照英文單詞+每行寬度的條件拆分,遇到有中文又有英文的文章,中文就會連成一長串。
知道了問題的所在,咱們就給他改進改進。先按英文拆分,然後在按中文拆分。下面是我的代碼,歡迎和大家一起探討。

package org.midi.J2ME.component;


import Java.util.Vector;


import Javax.microedition.lcdui.Font;



/** *//**

* <p>模塊功能:中英文字符串混排<p>

* 經過三個步驟,

* 先按單詞+每行寬度拆分;

* 這時中文會被當成一個長的英文單詞,

* 所以,接下來按照每行寬度,再進行拆分

* 聲明:程序中部分代碼取自isoJ2ME

* 我的msn:
[email protected]
* 歡迎大家與我交流

* <p>License: Lesser GPL (http://www.gnu.org)</p>

* @author midi 2007-8-31 下午04:10:47

* @version 0.1

* @since 2007

*

*/


public class Dialogue ...{


/** *//**

* 第一步:按分隔符來拆分字符串

*

* @param input

* 源字符串

* @param separator

* 分隔符

* @return

*/


public Vector tokenizeString(String input, String separator) ...{

Vector list = new Vector();

StringBuffer tempString = new StringBuffer();


for (int i = 0; i < input.length(); i++) ...{


if (input.charAt(i) != separator.charAt(0)) ...{

tempString.append(input.charAt(i));


} else ...{

tempString.append(input.charAt(i));

String newString = tempString.toString();

list.addElement(newString);

tempString.delete(0, tempString.length());

}

}


String newString = tempString.toString();

list.addElement(newString);


return list;

}



/** *//**

* 第二步:根據字體寬度按每行的顯示寬度拆分

*

* @param input

* 第一步拆分後的字符串

* @param width

* 每行的顯示寬度

* @param font

* 字體

* @return

*/


public Vector divideString(String input, int width, Font font) ...{

Vector list = new Vector();

StringBuffer tempString = new StringBuffer("");



if (input.length() < width) ...{

list.addElement(input);

return list;

}


Vector Words = this.tokenizeString(input, " ");



for (int i = 0; i < Words.size(); i++) ...{


if (font.stringWidth(tempString.toString() + Words.elementAt(i)) < width) ...{

tempString.append((String) Words.elementAt(i));


} else ...{

list.addElement(tempString.toString());

tempString.delete(0, tempString.length());

tempString.append((String) Words.elementAt(i));

}

}


list.addElement(tempString.toString());


return list;

}



/** *//**

* 第三步:把第二步的結果再拆分,主要是處理中文的換行

*

* @param list

* 第二步的結果

* @param width

* 每行的寬度

* @param font

* 字體

* @return

*/


public Vector divideString(Vector list, int width, Font font) ...{

Vector listRet = new Vector();


for (int i = 0; i < list.size(); i++) ...{

String tempString = (String) list.elementAt(i);


// 已經分割好的


if (font.stringWidth(tempString) <= width) ...{

listRet.addElement(tempString);


} else ...{


StringBuffer sb = new StringBuffer("");


for (int j = 0; j < tempString.length(); j++) ...{


if (font.stringWidth(tempString.charAt(j) + sb.toString()) < width) ...{

sb.append(tempString.charAt(j));


} else ...{

String newString = sb.toString();

listRet.addElement(newString);

sb.delete(0, sb.length());

sb.append(tempString.charAt(j));

}

}


String newString = sb.toString();

listRet.addElement(newString);

}

}


return listRet;

}

}