最近在做一个手机电子书的程序。发现按传统的字符串分割方法(即每行可以显示的文字宽度拆分)英文一个单词会被拆分到两行,看着特别不舒服。而纯粹的按照英文单词+每行宽度的条件拆分,遇到有中文又有英文的文章,中文就会连成一长串。
       知道了问题的所在,咱们就给他改进改进。先按英文拆分,然后在按中文拆分。下面是我的代码,欢迎和大家一起探讨。
package org.midi.j2me.component;
import java.util.Vector;
import javax.microedition.lcdui.Font;
/** 
 * <p>模块功能:中英文字符串混排<p> 
 * 经过三个步骤,
 * 先按单词+每行宽度拆分; 
 * 这时中文会被当成一个长的英文单词,
 * 所以,接下来按照每行宽度,再进行拆分
 * 声明:程序中部分代码取自isoj2me
 * 我的msn:crazyjava@hotmail.com
 * 欢迎大家与我交流
 * <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;
    }
}
转自:http://blog.csdn.net/midi13/archive/2007/08/31/1766947.aspx