|
|
|
|
把中文作为双字符处理的subString构件 发布时间:2006-08-02 00:00:00 作者:cservice 出处:goComDevCenter 语言:中文 阅读次数:1467次 |
| 需求:将中文作为两个字符处理,如果遇到结尾是半个中文字符,则按参数处理。
例如:123ac中国 substring(123ac中国,0,6)
可以选择输出为 123ac中,123ac,123ac?
代码如下:
import org.w3c.dom.*;
import java.io.UnsupportedEncodingException;
import java.util.regex.*;
import com.primeton.tp.common.logger.Logger;
import com.primeton.tp.core.api.BizContext;
import com.primeton.business.bncommon.bizlet.util.BNXmlUtil;
/**
* @author 王文杰
* @version 1.0
* @date 2006-6-27
* @class_displayName String_exp
*/
public class String_exp {
/**
* 取子字符串操作(中文算两个字节)
* @param doc type: Document, DOM;
* @param param type: BizContext;
* @return: int ,运算逻辑返回值,如果失败返回0,成功返回1
* @throws Exception
*
* ** bizlet 的显示名称 **
* @bizlet_displayName BL_subString_byte
* @canExport true
* @bizlet_param passing="in_out" type="field" value="/" name="" desc="存放Substring得到的子串"
* @bizlet_param passing="in_out" type="constant" value="/" name="" desc="原始字符串(可以是变量)"
* @bizlet_param passing="in_out" type="constant" value="/" name="" desc="整数,子串的开始位置,从零开始"
* @bizlet_param passing="in_out" type="constant" value="/" name="" desc="整数,子串的长度"
* @bizlet_param passing="in_out" type="constant" value="/" name="" desc="半个中文字符的处理方式,分三种,参数可以是-1(忽略半个字符)0(不做处理)1(取全中文字符)"
*/
public static int BL_subString_byte(Document doc, BizContext param) throws Exception{
int start,end,newEnd;
Node result = (Node)param.getParaObjectAt(0);
String source = (String)param.getParaObjectAt(1);
String startString = (String)param.getParaObjectAt(2);
String endString = "0";
String halfFlag = "0";
try{
if (param.getLength() >= 4) {//判断是否存在第四个参数
endString = (String) param.getParaObjectAt(3);
}
if (param.getLength() >= 5) {//判断是否存在第五个参数
halfFlag = (String) param.getParaObjectAt(4);
//判断参数是否正确
if(halfFlag.equals("0")==false&&halfFlag.equals("1")==false&&halfFlag.equals("-1")==false)
return -2;
}
start = Integer.parseInt(startString);
if (endString.equals("0")) {
end = source.length();
} else {
end = Integer.parseInt(endString);
}
Logger.debug("start:"+start);
Logger.debug("end:"+end);
//将字符写入字节
byte[] bytesGB2312 = source.getBytes("GB2312");
if (start < 0 || start > end || end > bytesGB2312.length)
return -1;
//根据半中文处理方式取中止字符位数
newEnd=findChinese(source,end,halfFlag);
String rltString = new String(bytesGB2312,start,newEnd, "GB2312");
BNXmlUtil.setNodeValue(result, rltString);
}
catch(Exception e){
Logger.error("BNString:BL_subString error!"+e.getMessage());
return -2;
}
return 1;
}
// 方法根据半中文处理方式取中止字符位数
public static int findChinese(String source,int in_end,String in_half) throws UnsupportedEncodingException{
int end = in_end;
int half = Integer.parseInt(in_half);
int j = 0;
byte[] bytesGB2312 = source.getBytes("GB2312");
for(int i=end-1;i>=0;i--){
System.out.println(bytesGB2312[i]);
if(bytesGB2312[i]<0||bytesGB2312[i]>127)
{j++;
}
else{
//遇到非中文字符终止循环
if(j%2!=0)
end = end + half;
break;
}
//数组顶部
if(i==0){
if(j%2!=0)
end = end + half;
}
}
return end;
}
}
|
|
| 声明:本栏目转载文字、造型、样式、图形及程序如有来自网络,版权归原作者或首发媒体所有,欢迎任何个人访问或者转载,若有作者及出处有误,请来信说明,我们将及时更正。 |
|