374、编写一个截取字符串的函数,输入为一个字符串和字符数,输出为按字符截取的字符串。
但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
String returnStr = "";
int k = 0;
for (int j = 0; j < i; j++) {
char c = str.charAt(j);
if (c < 256) {
k++;
if (k <= i) {
returnStr += c;
}
} else {
k += 2;
if (k <= i) {
returnStr += c;
}
}
}
return returnStr;
}
try {
byte[] bs = str.getBytes("GBK");
String result = new String(bs, 0, length, "GBK");
char last = result.charAt(result.length()-1);
if (last==0xFFFD) result = result.substring(0, result.length()-1);
System.out.println(result);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
顺便问一下,374是题号?
try {
byte[] bs = str.getBytes("GBK");
if (length>=bs.length) return str;
String result = new String(bs, 0, length, "GBK");
char last = result.charAt(result.length() - 1);
if (last == 0xFFFD)
result = result.substring(0, result.length() - 1);
return result;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
for (int j = 0; j < i; j++) {
应该改成
for (int j = 0; j < i && j < str.length(); j++) {
否则可能会有越界错。
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
int codePoint = 0;
for(int i=0; i<count; i++) {
codePoint = str.codePointAt(i);
String s = Array.get(Character.toChars(codePoint),0).toString();
sb.append(s);
}
return sb.toString();
}测试可以使用
http://topic.csdn.net/u/20110821/08/bed95274-215e-44d8-949e-8617c27a5925.htmlpublic String leftByteString(String src, int len) {
StringBuilder buf = new StringBuilder();
int count = 0;
for (char c : s.toCharArray()) {
count += (c>=0x4e00 && c<=0x9fa5) ? 2 : 1;
if (count > len) {
return buf.toString();
}
buf.append(c);
}
return buf.toString();
}
public class Test {
public static void main(String[] args) throws Throwable {
System.out.println(byteString("我ABC汉DEF", 6, "UTF-8"));
System.out.println(byteString("我ABC汉DEF", 6, "UTF-16"));
} public static String byteString(String src, int length, String charset) throws Exception {
int len = (length > src.length()) ? src.length() : length;
for (int i=len; i>=0; i--) {
if (src.substring(0, i).getBytes(charset).length <= length) {
return src.substring(0, i);
}
}
return src;
}
}
public static String bSubstring(String s, int length) throws Exception
{ int n=0;
int i=0;
int k=0;
byte b[]=s.getBytes();
for(;i<b.length && k<length;i++){
if(b[i]<0){
n=n+1;
}
k++;
}
if(n%2!=0){
if(b[i-1]<0 && b[i]<0){
i=i-1;
}else if(b[i-1]>0 && b[i]<0){
i=i-1;
}
} return new String(b,0,i);
}
public static void main(String[] args) {
try {
System.out.println(new CharJieQu().bSubstring("我abc汉def字gh",2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}汉字占两个字节并且字节都是大于零的,英文字符占一个字节并且字节是小于零的。这个是解决本题目的关键所在。以上是代码,本人亲测过了。如有不明之处 加群:107187002 大家一起交流一下
public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
例如:
"unhappy".substring(2) returns "happy"
"Harbison".substring(3) returns "bison"
"emptiness".substring(9) returns "" (an empty string)
参数:
beginIndex - 开始处的索引(包括)。
返回:
指定的子字符串。
抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负或大于此 String 对象的长度。
--------------------------------------------------------------------------------
substring
public String substring(int beginIndex,
int length)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,一直到 length-1 位置处的字符串。
示例:
"hamburger".substring(4,8) returns "urge"
"smiles".substring(1,5) returns "mile"
参数:
beginIndex - 开始处的索引(包括)。
返回:
指定的子字符串。
抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负,或length大于字符串长度。
-----------------------------------------------------以下为rongew更新--------------------------------------------
C#中 substring() 有两个重载函数
substring(int a) 用法同上
substring(int a,int b) b参数应该为截取后的字符串长度
上面string得用法不只是针对哪种语法
针对的是c#
--------------------------------------------------------
在VB中,如上的substring用法是正确的
-----------------------------------------------------以下为crazyghost_von更新--------------------------------------------
以上函数的用法在JavaScript中也是正确的。
-----------------------------------------------------------------------------------------------------------------------------------
下面是在javascript中的用法.
在JS中, 函数声明: stringObject.substring(start,stop)
start是在原字符串检索的开始位置,stop是检索的终止位置,返回结果中不包括stop所指字符.
编辑本段
示例
<script type="text/javascript">
var str="Hello world!"
document.write(str.substring(1,3));
</script>
上面返回字符串:"el";
str.substring(1,1) //返回空;
str.substring(1) //返回"ello world";
还有此函数中会出现奇怪的现象,当出现str.substring(5,0);
这又是怎么回事,不过返回的是"hello",
str.substring(5,1) //返回"ello",截去了第一位,返回余下的.
可见substring(start,end),可以有不同的说明,即start可以是要返回的长度,end是所要去掉的多少个字符(从首位开始).
在JS中,substr(start,length),用得较方便.