お疲れ様です。はるさらと申します。
Javaで文字列を扱っていると、
意図せず「0x00」(ヌル文字)が混ざってしまうことがあります。
これはファイル入出力や外部システムとの連携時に発生しやすく、
そのままでは処理がうまく動作しないケースも少なくありません。
本記事では、Javaで文字列から0x00を削除する方法をサンプルコード付きで解説します。
基本的な方法から実務でよく使うケース、代替手法の比較まで幅広く紹介します。
関連記事:
0x00が文字列に含まれる原因とは?
「0x00」は16進数で表現されるヌル文字(NULL character, \u0000)を意味します。
この文字が文字列に含まれる原因には以下があります。
- バイナリファイルを文字列として読み込んだ
- C言語など他言語とのデータ連携
- データベースや通信での終端文字が混入
JavaのStringは内部的にヌル文字を保持できますが、
出力や処理で予期せぬ不具合を引き起こすことがあります。
基本例:replaceで0x00を削除する
もっともシンプルな方法はString#replaceを使うことです。
public class RemoveNullExample {
public static void main(String[] args) {
String text = "Hello\u0000World";
String result = text.replace("\u0000", "");
System.out.println(result); // HelloWorld
}
}
ここでは \u0000 を空文字に置換して、文字列から削除しています。
シンプルで直感的に理解できる方法です。
実務利用例:trimでは削除できないケースに注意
「文字列の不要な空白を削除する」という発想でtrim()を使うことも考えられますが、0x00は削除されません。
public class TrimTest {
public static void main(String[] args) {
String text = "\u0000Hello\u0000";
String result = text.trim();
System.out.println("[" + result + "]"); // [Hello?] (先頭の0x00は残る)
}
}
trim()は空白や改行などのホワイトスペースを対象としますが、
ヌル文字は対象外です。
そのため、replaceや正規表現を使う必要があることを覚えておきましょう。
代替手法の比較:正規表現やバイト処理での削除
1. 正規表現を使う方法
正規表現を利用すれば、複数の制御文字をまとめて削除できます。
public class RegexExample {
public static void main(String[] args) {
String text = "A\u0000B\u0001C";
String result = text.replaceAll("\\x00", "");
System.out.println(result); // AB\u0001C(0x00のみ削除)
}
}
\\x00 を指定すれば0x00だけ削除できますし、[\\x00-\\x1F] と範囲を指定すれば制御文字全体を除去できます。
2. バイト配列として処理する方法
場合によってはStringではなくbyte[]として処理し、
不要な0x00を取り除く方法も有効です。
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class ByteArrayExample {
public static void main(String[] args) {
byte[] data = "Test\u0000Data".getBytes(StandardCharsets.UTF_8);
byte[] cleaned = Arrays.stream(data)
.filter(b -> b != 0x00)
.collect(StringBuilder::new,
(sb, b) -> sb.append((char) b),
StringBuilder::append)
.toString()
.getBytes(StandardCharsets.UTF_8);
System.out.println(new String(cleaned, StandardCharsets.UTF_8));
// 出力: TestData
}
}
こちらはやや複雑ですが、バイナリデータを扱う際には役立ちます。
注意点と間違えやすいポイント
trim()では0x00を削除できない
ホワイトスペース処理と混同しないようにする。- バイナリデータを文字列に変換するときに混入しやすい
そのまま表示や比較に使うとバグの原因になる。 - 正規表現を使う場合はパフォーマンスに注意
大量データを処理する場合はreplaceの方が効率的。
関連記事リンク
- 【Java】0x00とStringの扱いを解説!初心者向けサンプル付きでわかりやすく解説
- Javaでの「0x」の意味を解説 ― 初心者向けサンプル付き
- 【Java】0埋めで文字列や数値を整形する方法まとめ【初心者向けサンプル付き】
まとめ
0x00はヌル文字で、Javaの文字列にも含まれる場合がある- 削除するには
replace("\u0000", "")が最も簡単 trim()では削除できないため注意が必要- 正規表現やバイト配列処理でも削除可能
- データ処理の前にヌル文字を取り除くことで予期せぬ不具合を防げる
どなたかのお役に立てば幸いです。
それではまたー!




































