J2ME中的中英文混排

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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值