2010-03-26 59 views
29

测试了某人的代码,我注意到有几个JSP页面打印出怪异的非ASCII字符。进入源代码我发现这个珍闻:Java字符串替换和NUL(NULL,ASCII 0)字符?

// remove any periods from first name e.g. Mr. John --> Mr John 
firstName = firstName.trim().replace('.','\0'); 

用空字符替换字符中的字符甚至在Java中工作吗?我知道会终止一个C字符串。这是否会成为时髦人物的罪魁祸首?

+1

“我注意到有几个JSP页面打印时髦的非ASCII字符。”:这个问题的根本原因完全在于别处。谷歌“mojibake”。 – BalusC 2010-03-26 12:52:53

回答

78

用空字符替换字符中的字符甚至在Java中工作吗?我知道'\ 0'会终止一个c字符串。

这取决于你如何定义工作。是否用'\0'替换了所有出现的目标字符?绝对!

String s = "food".replace('o', '\0'); 
System.out.println(s.indexOf('\0')); // "1" 
System.out.println(s.indexOf('d')); // "3" 
System.out.println(s.length()); // "4" 
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd'); // "true" 

一切似乎对我很好! indexOf可以找到它,它计算为长度的一部分,其哈希码计算值为0;一切都按照JLS/API的规定。

是不是如果您期望用空字符替换字符会以某种方式从字符串中删除该字符。当然,它不会那样工作。空字符仍然是一个字符!

String s = Character.toString('\0'); 
System.out.println(s.length()); // "1" 
assert s.charAt(0) == 0; 

,如果你希望空字符终止字符串,也工作。它是从上面的代码段明显,但它也明显地在JLS指定(10.9. An Array of Characters is Not a String):

在Java编程语言,不同于C,的char阵列不是String,并且既不是String也不阵列的char以'\ u0000'(NUL字符)结尾。


这会是罪魁祸首的时髦人物?

现在我们谈论的是完全不同的东西,即字符串如何在屏幕上呈现。事实是,即使“你好世界!”如果你使用dingbats字体会看起来很时髦。 unicode字符串在一个语言环境中可能看起来很时髦,但在另一个语言环境中可能看起来很时髦即使是一个正确渲染的包含中文字符的unicode字符串,对于来自格陵兰岛的某些人来说仍然会显得很怪异。

也就是说,空字符可能看起来很时髦;通常它不是你想要显示的角色。也就是说,由于null字符不是字符串终止符,因此Java不仅能以这种或那种方式处理它。


我们解决我们假设有什么预期效果,即删除字符串中的所有时段,最简单的办法就是使用replace(CharSequence, CharSequence)超载。

System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU 

replaceAll解决方案在这里提到过,但与正则表达式,这就是为什么你需要躲避点元字符,而且很可能要慢一些工作。

+2

现在,这是一个很好的解释。而且你正在用正确的方法来替换这些东西:) – BalusC 2010-03-26 13:50:57

+1

+1:非常好,非常彻底! – 2010-03-26 15:49:41

4

用空字符替换字符串中的字符 即使在 Java中?

这会是罪魁祸首的时髦人物?

很可能。

4

我认为应该是这样。要清除角色,您应该使用replace(".", "")

+3

这是一个语法错误。 – 2010-03-26 12:55:47

+0

糟糕,没有测试它。我现在要纠正它。 – 2010-03-26 14:21:53

8

应该可能改为

firstName = firstName.trim().replaceAll("\\.", ""); 
+0

我实际上是要用它来修复它。 – praspa 2010-03-26 12:54:50

+6

'replaceAll'就像这里的大锤。你只想用空字符串替换char。你根本不想替换模式。只需使用'replace(“。”,“”)'。 – BalusC 2010-03-26 12:57:20

1

这确实会导致 “时髦人物”:

System.out.println("Mr. Foo".trim().replace('.','\0')); 

生产:

Mr[] Foo 
在我的Eclipse控制台,其中[]是

显示为方框。正如其他人发布的那样,使用String.replace()