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