35

他の誰かのコードをテストしてみると、ファンキーな非ASCII文字を印刷しているJSPページがいくつかあることに気づきました。ソースに浸って、私はこの一口を見つけました:

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

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

4

5 に答える 5

90

文字列内の文字をヌル文字に置き換えることは、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でなくStringStringの配列もchar'\ u0000'(NUL文字)で終了しません。


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

今、私たちはまったく異なること、つまり文字列が画面上でどのようにレンダリングされるかについて話しています。真実は、「Helloworld!」ですら。絵記号フォントを使用するとファンキーに見えます。Unicode文字列は、一方のロケールではファンキーに見えるかもしれませんが、もう一方のロケールではそうではありません。たとえば漢字を含む適切にレンダリングされたUnicode文字列でさえ、たとえばグリーンランドの人にはファンキーに見える場合があります。

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


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

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

解決策についてもここreplaceAllで説明しますが、これは正規表現で機能するため、ドットメタ文字をエスケープする必要があり、速度が低下する可能性があります。

于 2010-03-26T13:38:02.093 に答える
7

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

firstName = firstName.trim().replaceAll("\\.", "");
于 2010-03-26T12:51:52.513 に答える
5

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

于 2010-03-26T12:49:50.300 に答える
4

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

いいえ。

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

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

于 2010-03-26T12:49:23.123 に答える
2

これは「ファンキーなキャラクター」を引き起こします:

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

生成:

Mr[] Foo

私のEclipseコンソールでは、[]が四角いボックスとして表示されています。他の人が投稿しているように、を使用してString.replace()ください。

于 2010-03-26T12:53:22.343 に答える