首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 中英文混排換行演算法:三階段處理兼顧單詞完整與中文斷行

     編輯:J2ME

在手機電子書閱讀器開發中,純按字元寬度斷行會將英文單詞拆成兩行;純按單詞斷行則導致中文連成長串無法換行。本文提出三階段混排演算法:先按空白分詞(保護英文單詞),再按行寬切分(處理長中文串),最後對超寬行逐字元微調,完美兼顧中英文混排。

演算法流程

  1. 階段一:按分隔符分詞 — 以空白 ' ' 為界,將原文拆為 Vector<String>,英文單詞保持完整,中文句子因無空白會成為超長「單詞」。
  2. 階段二:按行寬重組 — 遍歷分詞陣列,累加 Font.stringWidth(),超寬則換行加入結果 Vector。此步驟解決英文單詞換行問題,但中文長串仍可能超寬。
  3. 階段三:逐字元微調 — 對階段二產出的每一行,若寬度仍超限,則逐字元檢查 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。
  • 避免大量 StringBuffer 物件: 可改用 char[] + 索引範圍,減少 GC 壓力。
  • 支援全形空白: 階段一分隔符可擴充為 ' '、' '(全形空白)等。

此演算法已在多款 J2ME 電子書產品上線驗證,兼顧閱讀體驗與執行效能,歡迎直接整合使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved