原题:
写一个方法 String left(String str ,int n) str字符串中可能包含中文,中文是2bytes,实现的功能是
如:“中abc12” n=4 则该方法返回“中ab” “中abc国a” n=6 则返回“中abc”中文是一半时不返回.
如:“中abc12” n=4 则该方法返回“中ab” “中abc国a” n=6 则返回“中abc”中文是一半时不返回.
--------------------------------------
你可以看到在原贴80楼以上,好多人用尽了if 和for循环去做各种各样的判断,甚至还有人用正则去匹配,不得不服。
原帖回复:
这个题目其实就是想让大家把字符转换为 gb2312 编码,
byte[] bytes=s.getBytes("gb2312");
这样英文字母和数字占一个字节,汉字占两个字节,比如“中abc12”,转化为 有符号的字节为:
-42
-48
97
98
99
49
50
接下来就是把 bytes encode 成 string 的过程,如此思路,大家为什么没有一个人想到?
有几个程序可以运行,因为你的JVM 碰巧就是用了gb2312.而不是 UTF-8. 万一程序到了国外人家用UTF-16,那就是错误的程序了。
这个程序应该这样写:
byte[] bytes=s.getBytes("gb2312");
这样英文字母和数字占一个字节,汉字占两个字节,比如“中abc12”,转化为 有符号的字节为:
-42
-48
97
98
99
49
50
接下来就是把 bytes encode 成 string 的过程,如此思路,大家为什么没有一个人想到?
有几个程序可以运行,因为你的JVM 碰巧就是用了gb2312.而不是 UTF-8. 万一程序到了国外人家用UTF-16,那就是错误的程序了。
这个程序应该这样写:
- Java code
-
public
String left(String s,
int
a){
String newString = null ;
try {
byte [] bytes = s.getBytes( " gb2312 " );
byte [] bytes2 = new byte [bytes.length]; // 用于新字符串的字节数组
for ( int i = 0 ;i < a;i ++ ) {
bytes2[i] = bytes[i]; // 将左边的字节复制到新的数组中
}
newString = new String(bytes2, " gb2312 " ); // 生成新的字符串
} catch (UnsupportedEncodingException ex) {
// Logger.getLogger(TextTest.class.getName()).log(Level.SEVERE, null, ex);
}
return newString;
}
如果用c#写:
- C# code
-
public
string
Left(String a,
int
n) {
byte [] stringBytes = System.Text.Encoding.GetEncoding( " gb2312 " ).GetBytes(a);
char [] chars = new Char[n];
Decoder d = Encoding.GetEncoding( " gb2312 " ).GetDecoder();
d.GetChars(stringBytes, 0 , n, chars, 0 );
return new string (chars);
} -
-
-
- 本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/189149,如需转载请自行联系原作者