web-dev-qa-db-ja.com

Java文字列置換とNUL(NULL、ASCII 0)文字?

他の人のコードをテストしてみると、ファンキーな非ASCII文字を印刷しているJSPページがいくつかありました。ソースを掘り下げると、このちょっとしたことがわかりました。

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

Stringの文字をヌル文字に置き換えることは、Javaでも機能しますか?そんなこと知ってる '\0'はC文字列を終了します。これはファンキーなキャラクターの犯人でしょうか?

31
praspa

Stringの文字をヌル文字に置き換えることは、Javaでも機能しますか? '\ 0'はc-stringを終了することを知っています。

それは、何が機能しているかをどのように定義するかにかかっています。ターゲット文字のすべての出現を_'\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で指定されているとおりです。

文字をヌル文字に置き換えると、文字列からその文字が何らかの形で削除されることが予想される場合、それはDOES N'T動作します。もちろん、そのようには動作しません。ヌル文字はまだ文字です!

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

また、ヌル文字がストリングを終了させると予想される場合、DOES N'Tは機能します。上記のスニペットから明らかですが、JLSでも明確に指定されています( 10.9。文字の配列は文字列ではありません ):

Javaプログラミング言語では、Cとは異なり、charの配列はStringではなく、Stringでも配列の配列でもありませんcharは '\ u0000'(NUL文字)で終了します。


これはファンキーなキャラクターの犯人でしょうか?

今、私たちはまったく異なること、つまり画面上で文字列がどのようにレンダリングされるかについて話している。真実は、「Hello world!」です。 dingbatsフォントを使用するとファンキーに見えます。ユニコード文字列は、あるロケールではファンキーに見えるかもしれませんが、他のロケールではそうではありません。たとえば、漢字を含む、適切にレンダリングされたユニコード文字列でさえ、たとえばグリーンランドの誰かにとってはファンキーに見えるかもしれません。

とはいえ、ヌル文字はおそらくファンキーに見えるでしょう。通常、表示したいキャラクターではありません。とはいえ、ヌル文字は文字列ターミネータではないため、Javaは何らかの方法でそれを処理することができます。


ここで、意図する効果、つまり文字列からすべてのピリオドを削除することを前提とするものに対処するための最も簡単な解決策は、replace(CharSequence, CharSequence)オーバーロードを使用することです。

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

ここでもreplaceAllソリューションについて説明しますが、これは正規表現で機能するため、ドットメタ文字をエスケープする必要があり、遅くなる可能性があります。

83

おそらくに変更する必要があります

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

Stringの文字をヌル文字に置き換えることは、Javaでも機能しますか?

いや.

これはファンキーなキャラクターの犯人でしょうか?

非常に可能性が高いです。

4

そうだと思います。文字を消去するには、代わりにreplace(".", "")を使用する必要があります。

4
Valentin Rocher

これにより、「ファンキーなキャラクター」が発生します。

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

生成するもの:

_Mr[] Foo
_

eclipseコンソールで、[]が正方形のボックスとして表示されます。他の人が投稿したように、String.replace()を使用します。

2
Jim Ferrans