文字列内の文字をヌル文字に置き換えることは、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で指定されているとおりです。
文字をnull文字に置き換えると、文字列からその文字が何らかの形で削除されると予想される場合は機能しません。もちろん、そのようには機能しません。ヌル文字はまだ文字です!
String s = Character.toString('\0');
System.out.println(s.length()); // "1"
assert s.charAt(0) == 0;
また、ヌル文字が文字列を終了することを期待している場合も機能しません。上記のスニペットから明らかですが、JLSでも明確に指定されています(10.9。文字の配列は文字列ではありません):
Javaプログラミング言語では、Cとは異なり、の配列はchar
でなくString
、String
の配列もchar
'\ u0000'(NUL文字)で終了しません。
これがファンキーなキャラクターの犯人でしょうか?
今、私たちはまったく異なること、つまり文字列が画面上でどのようにレンダリングされるかについて話しています。真実は、「Helloworld!」ですら。絵記号フォントを使用するとファンキーに見えます。Unicode文字列は、一方のロケールではファンキーに見えるかもしれませんが、もう一方のロケールではそうではありません。たとえば漢字を含む適切にレンダリングされたUnicode文字列でさえ、たとえばグリーンランドの人にはファンキーに見える場合があります。
とはいえ、ヌル文字はおそらくファンキーに見えます。通常、表示したいキャラクターではありません。とは言うものの、ヌル文字は文字列ターミネータではないため、Javaはそれを何らかの方法で処理する能力を超えています。
ここで、意図した効果、つまり文字列からすべてのピリオドを削除すると想定するものに対処するために、最も簡単な解決策はreplace(CharSequence, CharSequence)
オーバーロードを使用することです。
System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU
解決策についてもここreplaceAll
で説明しますが、これは正規表現で機能するため、ドットメタ文字をエスケープする必要があり、速度が低下する可能性があります。