项目中需要显示不同编码的文字,由于页面显示要求,当字符串长度超过60时需要截取后加...,英文状态下肯定没问题了,就是在简繁中文,日文这种双字节文字显示时截取需要判断是否截取到整个字而不是它的一半,查了相关资料只有以下类似的方法
private String subString(String src, int length) {
byte[] s = src.getBytes();
int flag = 0;
for (int i = 0; i < length; ++i) {
if (s[i] < 0)
flag++;
}
if (flag % 2 != 0)
length--;
byte[] d = new byte[length];
System.arraycopy(s, 0, d, 0, length);
return new String(d);
}
问题在于开发的操作系统是英文版的,如果仅仅执行byte[] s = src.getBytes();的话会依据本机的encode值将src(中文)转成乱码,这种情况下根本就没有判断出是否是中文字;但是如果又约定byte[] s = src.getBytes("GBK");又不能按预计的处理繁体或日本字。不知道大家有没有好的办法处理,我想在getbytes()时根据src的字符集来设,就是不知如何得到src的字符集。
谢谢
private String subString(String src, int length) {
byte[] s = src.getBytes();
int flag = 0;
for (int i = 0; i < length; ++i) {
if (s[i] < 0)
flag++;
}
if (flag % 2 != 0)
length--;
byte[] d = new byte[length];
System.arraycopy(s, 0, d, 0, length);
return new String(d);
}
问题在于开发的操作系统是英文版的,如果仅仅执行byte[] s = src.getBytes();的话会依据本机的encode值将src(中文)转成乱码,这种情况下根本就没有判断出是否是中文字;但是如果又约定byte[] s = src.getBytes("GBK");又不能按预计的处理繁体或日本字。不知道大家有没有好的办法处理,我想在getbytes()时根据src的字符集来设,就是不知如何得到src的字符集。
谢谢
/**
* 返回指定字节长度的字符串
*
* @param str String 字符串
* @param length int 指定长度
* @return String 返回的字符串
*/
public static String toLength(String str, int length) {
if (str == null) {
return null;
}
if (length <= 0) {
return "";
}
try {
if (str.getBytes("GBK").length <= length) {
return str;
}
} catch (Exception ex) {
}
StringBuffer buff = new StringBuffer(); int index = 0;
char c;
length -= 3;
while (length > 0) {
c = str.charAt(index);
if (c < 128) {
length--;
} else {
length--;
length--;
}
buff.append(c);
index++;
}
buff.append("...");
return buff.toString();
}
[^\x00-\xff]*
String str2 = "abcdefghijklmnopq";
String str1 = "abcdefghijklmnop";
String str3 = "abcdefghijklmno";
String str4 = "一二三四五六七八九十一二三四五六";
String str5 = "一二三四五六七八";
String str6 = "一二三四五六七";
String str7 = "一二三a四五六七八九十一二三四五六";
String append = " ...";
System.out.println(trancate(str1, 16, append));
System.out.println(trancate(str2, 16, append));
System.out.println(trancate(str3, 16, append));
System.out.println(trancate(str4, 16, append));
System.out.println(trancate(str5, 16, append));
System.out.println(trancate(str6, 16, append));
System.out.println(trancate(str7, 16, append));
} private static String trancate(String src, int length) {
return trancate(src, length, "");
}
private static String trancate(String src, int length, String append) {
int len = 0;
char[] chars = src.toCharArray();
StringBuffer sb = new StringBuffer();
int i = 0;
while(len < length) {
if(i >= chars.length) {
return sb.toString();
}
sb.append(chars[i]);
if(chars[i++] > 0xff) {
len += 2;
}else{
len++;
}
}
if(sb.toString().equals(src)) {
return sb.toString();
}else{
sb.append(append);
return sb.toString();
}
}
}
* 按字节数获取子字符串
* @param str 原字符串
* @param byteBeginIndex 开始位置
* @param byteEndIndex 结束位置
* @return 子字符串
*/
public static String subStringByByte(String str, int byteBeginIndex, int byteEndIndex)
{
String result = "";
int charLength = 0;
int tempIndex1 = 0;
int tempIndex2 = 0;
int charBeginIndex = -1;
int charEndIndex = -1; if(byteEndIndex > byteBeginIndex && byteBeginIndex >= 0)
{
for(int i = 0; i < str.length(); i++)
{
charLength = str.substring(i, i + 1).getBytes().length;
tempIndex1 = tempIndex2;
tempIndex2 += charLength; if(byteBeginIndex >= tempIndex1 && byteBeginIndex < tempIndex2)
{
charBeginIndex = i;
} if(byteEndIndex >= tempIndex1 && byteEndIndex < tempIndex2)
{
charEndIndex = byteEndIndex == tempIndex1? i: i + 1;
break;
}
} charEndIndex = charEndIndex == -1? (charBeginIndex == -1? 0: str.length()): charEndIndex;
charBeginIndex = charBeginIndex == -1? 0: charBeginIndex;
result = str.substring(charBeginIndex, charEndIndex);
} return result;
}