在手機電子書閱讀器開發中,純按字元寬度斷行會將英文單詞拆成兩行;純按單詞斷行則導致中文連成長串無法換行。本文提出三階段混排演算法:先按空白分詞(保護英文單詞),再按行寬切分(處理長中文串),最後對超寬行逐字元微調,完美兼顧中英文混排。
' ' 為界,將原文拆為 Vector<String>,英文單詞保持完整,中文句子因無空白會成為超長「單詞」。Font.stringWidth(),超寬則換行加入結果 Vector。此步驟解決英文單詞換行問題,但中文長串仍可能超寬。stringWidth(sb + char),超寬則斷行,確保中文能正常換行。import java.util.Vector;
import javax.microedition.lcdui.Font;
public class TextLayout {
/** 階段一:按分隔符分詞 */
public Vector tokenize(String text, String sep) {
Vector v = new Vector();
StringBuffer sb = new StringBuffer();
for (int i=0; i 0) v.addElement(sb.toString());
return v;
}
/** 階段二:按行寬重組(以空白為單位) */
public Vector wrapByWords(String text, int width, Font font) {
Vector lines = new Vector();
Vector words = tokenize(text, " ");
StringBuffer line = new StringBuffer();
for (int i=0; i 0) lines.addElement(line.toString());
return lines;
}
/** 階段三:逐字元微調超寬行 */
public Vector wrapByChars(Vector lines, int width, Font font) {
Vector out = new Vector();
for (int i=0; i 0) out.addElement(sb.toString());
}
return out;
}
/** 對外統一介面 */
public Vector layout(String text, int width, Font font) {
return wrapByChars(wrapByWords(text, width, font), width, font);
}
}
Font f = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
Vector lines = new TextLayout().layout(
"Hello 世界!This is a test 中文測試內容。", 176, f);
// lines 即為可直接 drawString 的每一行
char[] → int 寬度查找表,避免重複呼叫 stringWidth。char[] + 索引範圍,減少 GC 壓力。' '、' '(全形空白)等。此演算法已在多款 J2ME 電子書產品上線驗證,兼顧閱讀體驗與執行效能,歡迎直接整合使用。