最近在做一个手机电子书的程序。发现按传统的字符串分割方法(即每行可以显示的文字宽度拆分)英文一个单词会被拆分到两行,看着特别不舒服。而纯粹的按照英文单词+每行宽度的条件拆分,遇到有中文又有英文的文章,中文就会连成一长串。
       知道了问题的所在,咱们就给他改进改进。先按英文拆分,然后在按中文拆分。下面是我的代码,欢迎和大家一起探讨。
package org.midi.j2me.component;

import java.util.Vector;

import javax.microedition.lcdui.Font;

/**
 * <p>模块功能:中英文字符串混排<p>
 * 经过三个步骤,
 * 先按单词+每行宽度拆分;
 * 这时中文会被当成一个长的英文单词,
 * 所以,接下来按照每行宽度,再进行拆分
 * 声明:程序中部分代码取自isoj2me
 * 我的msn:该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。
 * 欢迎大家与我交流
 * <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