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

Posted

技术标签:

【中文标题】Java字符串替换和NUL(NULL,ASCII 0)字符?【英文标题】:Java string replace and the NUL (NULL, ASCII 0) character? 【发布时间】:2011-02-01 04:05:56 【问题描述】:

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

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

在 Java 中用空字符替换字符串中的字符是否有效?我知道 '\0' 将终止一个 C 字符串。这会是时髦角色的罪魁祸首吗?

【问题讨论】:

“我注意到一些 JSP 页面打印了时髦的非 ascii 字符。”:这个问题的根本原因完全在于其他地方。谷歌“mojibake”。 【参考方案1】:

在 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可以找到,算作长度的一部分,hash码计算的值为0;一切都由 JLS/API 指定。

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

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

如果您希望空字符终止一个字符串,它也不会工作。从上面的 sn-ps 可以看出,但在 JLS 中也明确指定(10.9. An Array of Characters is Not a String):

在 Java 编程语言中,与 C 不同,char 的数组不是 StringStringchar 的数组都不是由 '\u0000'(NUL 字符)终止.


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

现在我们谈论的是完全不同的事情,即字符串如何在屏幕上呈现。事实是,即使是“Hello world!”如果你使用 dingbats 字体会看起来很时髦。一个 unicode 字符串在一种语言环境中可能看起来很时髦,但在另一种语言环境中则不然。即使是一个正确渲染的 unicode 字符串,比如中国字符,对于来自格陵兰岛的人来说仍然可能看起来很时髦。

也就是说,不管怎样,空字符可能看起来很时髦;通常它不是您要显示的字符。也就是说,由于空字符不是字符串终止符,Java 完全能够以一种或另一种方式处理它。


现在要解决我们假设的预期效果,即从字符串中删除所有句点,最简单的解决方案是使用 replace(CharSequence, CharSequence) 重载。

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

这里也提到了replaceAll 解决方案,但它适用于正则表达式,这就是您需要转义点元字符的原因,并且可能会更慢。

【讨论】:

现在,这是一个很好的解释。而且您也在使用正确的方法来替换这些东西:)【参考方案2】:

应该改成

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

【讨论】:

其实我打算用这个来修复它。 replaceAll 在这里就像一把大锤。你只想用一个空字符串替换一个字符。您根本不想替换模式。只需使用replace(".", "")【参考方案3】:

我认为应该是这样。要擦除字符,您应该改用replace(".", "")

【讨论】:

【参考方案4】:

是否替换字符串中的字符 带有空字符甚至可以工作 爪哇?

没有。

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

很有可能。

【讨论】:

【参考方案5】:

这确实会导致“时髦的字符”:

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

产生:

Mr[] Foo

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

【讨论】:

以上是关于Java字符串替换和NUL(NULL,ASCII 0)字符?的主要内容,如果未能解决你的问题,请参考以下文章

删除“NUL”字符

ASCII

ASCII 码表

ASCII表

ascii码表

ASCII码表