web-dev-qa-db-ja.com

特殊文字\ 0 {NUL} in Java

文字列の\ 0(NUL)を置き換える方法は?

String b = "2012yyyy06mm";               // sth what i want
String c = "2\0\0\0012yyyy06mm";
String d = c.replaceAll("\\\\0", "");    // not work
String e = d.replace("\0", "");          // er, the same
System.out.println(c+"\n"+d+"\n"+e);

String bb = "2012yyyy06mm";
System.out.println(b.length() + " > " +bb.length());  

上記のコードは、コンソールで12> 11を出力します。おっと、どうしたの?

String e = c.replace("\0", "");
System.out.println(e);      // just print 2(a bad character)2yyyy06mm
9
user1900556

文字列"2\0\0\0012yyyy06mm"2 {NUL} {NUL} {NUL} 0 1 2で始まりませんが、代わりに2 {NUL} {NUL} {SOH} 2を含みます。

\001は単一のASCII 1文字(SOH)として扱われ、NULの後に1 2が続くものとしては扱われません。

その結果、3文字ではなく、2文字のみが削除されます。

文字列を分割する以外に、省略形 8進数のエスケープ に続く数字を表す方法はないと思います。

String c = "2" + "\0\0\0" + "012yyyy06mm";

または、次の桁が8進エスケープの一部として解釈されないように、(最後の)8進エスケープの3桁すべてを指定します。

String c = "2\000\000\000012yyyy06mm";

それが済んだら、次のように"\0"を置き換えます。

String e = c.replace("\0", "");

正しく動作します。

14
Alnitak