Java字符串替换和NUL(NULL,ASCII 0)字符?

时间:2010-03-26 12:48:03

标签: java string replace nul

测试了别人的代码,我注意到一些JSP页面打印出时髦的非ASCII字符。深入了解源头我发现了这个消息:

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

使用空字符替换String中的字符是否可以在Java中工作?我知道'\0'会终止一个C字符串。这会是时髦人物的罪魁祸首吗?

5 个答案:

答案 0 :(得分:81)

  

使用空字符替换String中的字符是否可以在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的数组不是StringStringchar数组都不会被'replace(CharSequence, CharSequence)终止\ u0000'(NUL角色)。


  

这会成为时髦角色的罪魁祸首吗?

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

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


现在要解决我们假设的预期效果,即从字符串中删除所有句点,最简单的解决方案是使用System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU 重载。

replaceAll

这里也提到了{{1}}解决方案,但这适用于正则表达式,这就是为什么你需要转义点元字符,并且可能会更慢。

答案 1 :(得分:8)

应该可能改为

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

答案 2 :(得分:4)

  

替换字符串中的字符   使用空字符甚至可以工作   爪哇?

没有

  

这会成为时髦角色的罪魁祸首吗?

很可能。

答案 3 :(得分:4)

我认为应该是这样的。要删除字符,您应该使用replace(".", "")代替。

答案 4 :(得分:1)

这确实会导致“时髦的角色”:

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

产生

Mr[] Foo

在我的Eclipse控制台中,[]显示为方框。正如其他人发布的那样,请使用String.replace()

相关问题