Javaでは、文字列中に視覚的に表示されない文字(不可視文字)を挿入することで、出力の整形や特殊な処理を実現できます。代表的な不可視文字にはタブ(U+0009)、改行(U+000A)、ゼロ幅スペース(U+200B)などがあります。これらの文字は、コードの可読性を高めたり、データの埋め込みやフィルタリング対策に利用されます。
1. エスケープシーケンスによる挿入
Javaでは、標準のエスケープシーケンスを使用して基本的な不可視文字を直接記述できます。
public class InvisibleTextExample {
public static void main(String[] args) {
String formattedText = "項目1\t項目2\n項目3\t項目4";
System.out.println(formattedText);
}
}
上記コードでは、\tがタブ文字、\nが改行文字として機能し、出力時に視覚的に空白や改行として反映されます。
2. Unicodeコードによる明示的指定
エスケープシーケンスでは対応できない特殊な不可視文字は、Unicodeの十六進表記で指定します。形式は\uXXXXです。
public class UnicodeInvisibleExample {
public static void main(String[] args) {
String hiddenSeparator = "データ\u200B分割\u200Bポイント";
String zeroWidthSpace = "\u200B"; // ゼロ幅スペース
String tabUnicode = "\u0009"; // タブ文字(\tと同等)
System.out.println("元文字列: " + hiddenSeparator);
System.out.println("長さ: " + hiddenSeparator.length()); // ゼロ幅スペースも文字数にカウント
}
}
この例では、\u200B(ゼロ幅スペース)を挿入しても、表示上は影響がなく、文字列長には含まれるため、文字列操作や検証に有用です。
3. カスタム不可視文字の生成
必要に応じて、動的に不可視文字を組み合わせて使用することも可能です。
import java.util.ArrayList;
import java.util.List;
public class DynamicInvisibleBuilder {
public static void main(String[] args) {
List<String> segments = List.of("ユーザーA", "ユーザーB", "ユーザーC");
String separator = "\u200B\u0009\u200B"; // ゼロ幅スペース+タブ+ゼロ幅スペース
StringBuilder result = new StringBuilder();
for (int i = 0; i < segments.size(); i++) {
result.append(segments.get(i));
if (i < segments.size() - 1) {
result.append(separator);
}
}
String output = result.toString();
System.out.println("出力: \"" + output + "\"");
System.out.println("文字列長: " + output.length()); // 15文字(不可視文字含む)
}
}
この構造では、不可視文字の組み合わせにより、外部システムやツールとの互換性を保ちながら、人間には見えない区切りを実装できます。