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