`

JAVA面试题解惑系列(六)——字符串(String)杂谈

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
50
6
分享到:
评论
36 楼 sahero167 2008-10-21  
不顶,不行,我真的很感谢您的文章~希望您再接再厉,,谢谢!真的~!
35 楼 muyuqian 2008-09-03  
博主高人,望解惑。

有关字符串,其它语言的char函数可以将相临的两个大于ASCII码值的字符,以其16进制数值连接后,以一个unicode的字符显示。如char(202)+char(201),在powerbuilder里显示结果为:噬,但在java里,其不能有效联接。显示成:??   请看如下代码:

public class Test{
public static void main(String[] args){
char[] a = {97,98};
char[] b = {202,201};

String sa = new String(a);
String sb = new String(b);

System.out.println(sa);
System.out.println(sb);
}
}

其显示结果为
ab
??

单字节字符可以显示,双字节字符不能显示。java是否有像其它语言类似的办法,让相临字符连接后,以一个unicode码对应的值显示。不知我的问题表述清楚否?
34 楼 yu_xian81 2008-08-25  
见识了诸多高人,此行非虚!
33 楼 kruce 2008-08-13  
自造轮子,不如check下surrogate pair + codepoint
32 楼 rz_wang 2008-08-11  
多谢,辛苦了~!
31 楼 臧圩人 2008-07-28  
回复TNTest:

Very good!

非常感谢你提供的资料,很全面。我会在新版本中加入这方面内容的。期待你能够继续支持
30 楼 TNTest 2008-07-26  
又清晰了一些东西,谢谢 臧圩人。
就是最后关于判断中文的部分觉得还是有些东西需要说说。因为实际情况中正是这部分问题比较多。
zhanjia的方法简单又有效啊。
而且我不认为这里需要判断不同的编码方式,一个汉字对于String来说唯一对应一个unicode的code point,需要区分编码方式的情况只在String向外输出结果和向String传入的时候,一旦String生成后,它的内部编码是统一的。
而且把String打散成char是危险的,主要是code unit的问题。
实际情况中,
    如果input是String,判断是否中文根本无需考虑编码。
    如果input是Stream,一般来说会有相关的值标识它的编码方式,没有的话也能通过一些工具来得到(比如mozilla的jchardet),然后转换为String。
zhanjia的方法有两个问题:
1.需要完善对unicodez中关于中文的区段(Unicode Block)定义,这里有个总结的很全的:http://blog.oasisfeng.com/2006/10/19/full-cjk-unicode-range/
2.直接操作String来实现功能,性能上应该不会很好。
29 楼 constant 2008-07-23  
好,感谢lz解答
28 楼 臧圩人 2008-07-23  
回复constant:

String类的方法charAt(int index)跟substring()方法一样,是按照字符截取的,所以不会出现半个汉字的情况。但是在按字节截取时就会出现,请看:

import java.io.UnsupportedEncodingException;

public class CutString {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String s = "我ZWR爱JAVA";
		// 获取GBK编码下的字节数据
		byte[] data = s.getBytes("GBK");
		byte[] tmp = new byte[6];
		// 将data数组的前六个字节拷贝到tmp数组中
		System.arraycopy(data, 0, tmp, 0, 6);
		// 将截取到的前六个字节以字符串形式输出到控制台
		s = new String(tmp);
		System.out.println(s);
	}
}

运行结果:
  • 我ZWR?
27 楼 constant 2008-07-23  
同时要保证不会出现截取了半个汉字的情况。

lz,什么时候会出现这种情况呢?c = orignal.charAt(i);   可能出现半个汉字?
举个例子看看。谢了
26 楼 臧圩人 2008-07-23  
JAVAWORLD.COM.TW网友hkdennis2k写道:

很少人會留意這一點
就是 String.getBytes 本來就很一件相對地很沒效率的動作
(getString 後寫入 stream 相比直接使用 writer)

JRE 的實現這個 method 的做法會引起大量而不必要的的 array copy, temporary object 和 class loading
特別是如果你交替使用多過一種 charset 的話情況會更嚴重

雖然自從 1.4 已有很大修改, 但效率還是比較低
(剛讀了 1.6 的 source, 好像好多了)

而且, CJK 不是 JRE 必需支持的 charset, 也有可能因應情況而出現 UnsupportedEncodingException

如果只是想 detect 某個 char 是否中文字,
Unicode 是有明確分出 CJK 的區段
只需用 Character.UnicodeBlock 就可以簡單地找出這個字是那一區

如果你整個 application 當中高密度使用 getBytes / new String 的話
是很容易令到 memory 和 GC 使用量受壓的
當我還是新手時就試過,
從 profiler 看到超不合理的 cpu time 和 byte[]/char[] 數量和大小
修正過後, 那個 JSP 和 server 整體的 response time 得到四倍以上提昇, 而 cpu /memory 用量卻大減一半以上
25 楼 臧圩人 2008-07-22  
回复wzpwork、Rainge、elf8848、yuanyao:
谢谢大家的支持和鼓励,请多多关注,多多提出宝贵意见
24 楼 yuanyao 2008-07-22  
捡回了点东西,谢了~~~
23 楼 elf8848 2008-07-22  
高人啊, 太好了
22 楼 Rainge 2008-07-21  
写得太好了,不得不顶
21 楼 wzpwork 2008-07-21  
好文章,写得很好.
20 楼 臧圩人 2008-07-21  
回复backbase:
谢谢你的支持,我会保持更新并尽力加快频率。请多多关注
19 楼 backbase 2008-07-21  
谢谢楼主的文章 ,要是每天都有这么好的一遍文章,那简直太棒了。呵呵
18 楼 臧圩人 2008-07-21  
回复billgacsli:
我看了你的文章,你的思路很有意思,不过这个思路是有漏洞的,比如“襆”恰好在被截取的字符串中,像“我ZWR爱JAVA襆”,你的方法就会得出错误的结果。

另外leftStr(str,11)=="我LRW爱";这里的11应该是6吧?
17 楼 billgacsli 2008-07-21  
关于最后一个,中文字符串的按字节截取问题,我想了一个新办法
LZ有兴趣可以看看http://billgacsli.programfan.com/
呵呵

相关推荐

Global site tag (gtag.js) - Google Analytics