程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 中英文混排

中英文混排

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