正对上面一位前辈的程序,小小更改一下,才能真正获得需要的结果
package foo;/**
* 写一个方法 String left(String str ,int n) str字符串中可能包含中文,中文是2bytes,实现的功能是
* 如:“中abc12” n=4 则该方法返回“中ab” “中abc国a” n=6 则返回“中abc”中文是一半时不返回
* @author Fee Share
*
*/
public class T {
public static void main(String[] args) {
String s = "我是acf中d国人adfgdd123";
System.out.println(getSubString(s, 4)); } private static String getSubString(String s, int n) {
int count = 0;
int offset = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] > 256) {
offset = 2;
count += 2;
} else {
offset = 1;
count++;
}
if (count == n ) {
return s.substring(0, i+1 );
}if((count == n + 1 && offset == 2)){
return s.substring(0,i);
}
}
return null; }
}
package foo;/**
* 写一个方法 String left(String str ,int n) str字符串中可能包含中文,中文是2bytes,实现的功能是
* 如:“中abc12” n=4 则该方法返回“中ab” “中abc国a” n=6 则返回“中abc”中文是一半时不返回
* @author Fee Share
*
*/
public class T {
public static void main(String[] args) {
String s = "我是acf中d国人adfgdd123";
System.out.println(getSubString(s, 4)); } private static String getSubString(String s, int n) {
int count = 0;
int offset = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] > 256) {
offset = 2;
count += 2;
} else {
offset = 1;
count++;
}
if (count == n ) {
return s.substring(0, i+1 );
}if((count == n + 1 && offset == 2)){
return s.substring(0,i);
}
}
return null; }
}
return null;
应该是
return "";
public static void main(String[] args) {
String s = "我是acf中d国人adfgdd123";
System.out.println(getSubString(s, 3)); } private static String getSubString(String s, int i) {
char[] arr=s.toCharArray();
int m = 0;
for(int j=0;j<arr.length;j++){
if(arr[j]>256){
m++;
}
if(m+j==i){
return s.substring(0, i-m);
}
}
return "";
}
改成下面这样就可以啦public class T {
public static void main(String[] args) {
String s = "我是acf中d国人adfgdd123";
System.out.println(getSubString(s, 4)); } private static String getSubString(String s, int n) {
//加上这句话就可以啦
if(n >= s.length()){
return s;
}
int count = 0;
int offset = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] > 256) {
offset = 2;
count += 2;
} else {
offset = 1;
count++;
}
if (count == n ) {
return s.substring(0, i+1 );
}if((count == n + 1 && offset == 2)){
return s.substring(0,i);
}
}
return null; }
}
public class NewString {
/**
*
* @param str
* @param n 读取长度
* @return
*/
public static String left(String str,int n){
//将String转换为char[]
char[] chArr = str.toCharArray();
int i=0,len = 0;
while(i < chArr.length){//计算实际读取的长度
if (chArr[i] > 255) //如果是中文
len += 2;//长度为2
else //一般类型
len++;
if(len > n)//如果大于就退出
break;
i++;
}
return str.substring(0,i);
}
public static void main(String[] args){
String str = "df阿飞到了jdsfsd阿飞到了是否快乐";
int n=11 ;
System.out.println(NewString.left(str, n));
}
}
public static String left(String str, int n) {
char[] c = str.toCharArray();
for (int i = 0; i < n; i++) {
if (String.valueOf(c[i]).getBytes().length == 2) {
n--;
}
}
return str.substring(0, n);
} public static void main(String[] args) {
String s1 = "中abc12";
String s2 = "中abc国a";
System.out.println(T1.left(s2, 6));
}
如:System.out.println(T1.left(s2, 100));
晕~!判断一下n可字符数谁大谁小先,不就OK吗,不要那么死板
public class CutByBytes { public static void main(String[] args) {
String str = "短信duanxin短信duanxin贵州guizhou贵州guizhou";
System.out.println(left(str, 0));
System.out.println(left(str, 1));
System.out.println(left(str, 5));
System.out.println(left(str, 6));
System.out.println(left(str, 7));
System.out.println(left(str, 8));
} private static String left(String str, int byte_len) {
if (str.getBytes().length < byte_len) {
return str;
} String substr = str;
while (substr.getBytes().length > byte_len) {
substr = substr.substring(0, substr.length() - 1);
}
return substr;
}
}
public String asc(String a,int n){
String a="我shi是dfdf*中国人china";
char[] ch=a.toCharArray();
int count=0;
for(int i=0;i<ch.length;i++){
if(ch[i]>123){
count=count+2;
}else{
count=count+1;
}
if(count==n){
System.out.println(a.substring(0,i+1));
}else if(count>n){
System.out.println(a.substring(0,i));
return;
}
}
}
String a="我shi是一d中国人china";
byte[] bt=a.getBytes();
String ss=null;
if(bt[6]<0){
ss=new String(a.getBytes(),0,5);
}else{
ss=new String(a.getBytes(),0,6);
}
System.out.println(ss);突然想到一个更方便的!
String(char[] value, int offset, int count)
分配一个新的 String,它包含来自该字符数组参数的一个子数组的字符。可以直接满足要求。当然我始终觉得题目的要求绝对不是让你去调API的
StringBuffer temps= new StringBuffer();
int temp_end = 0;
char[] c = s.toCharArray();
for(char ch: c){
temp_end=(ch&0xff00)!=0 ? temp_end+2 : temp_end+1;
if(temp_end>index)
break;
temps.append(ch);
}
return temps;
}