一个基础题居然难倒了一大片

链接:http://topic.csdn.net/u/20090805/19/8F0B4B36-D4C7-47B0-8570-DFF46A2C84F4.html
 
原题:
写一个方法  String left(String str ,int n) str字符串中可能包含中文,中文是2bytes,实现的功能是
如:“中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,那就是错误的程序了。
这个程序应该这样写:
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);
}
update:本程序,没有判断半个中文的情况,如果要处理的话几句代码即可,并且程序复杂度不变

本文出自 “Xhinker” 博客,转载请与作者联系!

你可能感兴趣的:(java,职场,休闲,基础题)