在java中,有没有办法将一个控制字符转换成字符串中的一组字符?

In java, is there a way to convert a control character to a set of characters in a string?

抱歉,如果标题措辞不当,但我正在尝试制作一个程序,它可以找到一种方法来检测字符串中的每个单独字符是否是控制字符。如果有一个控制字符,它应该用一组字符替换那个控制字符。例如,字符串“an/0Example”应该变成“anotherExample”,假设“other”是我要用控制字符替换的。我目前的代码如下,但我的理解是一个字符(控制字符除外)不能包含多个字符。

    int i = 0;
    char exampleCh = identifier.charAt(i);
    
    for(i = 0; i < identifier.length(); i++){
        if(Character.isISOControl(example)){
            identifier = identifier.replace(exampleCh, 'exampleReplacement');
        }
     }

编译器处理的转义

字符串文字中嵌入的转义符由编译器处理,并转换为预期字符。因此在运行时,字符串对象包含一个空值,并且 not 包含一个反斜杠和在您的文字 "an[=13=]Example".

中看到的零

你可以在下面的代码中看到这一点。

    String input = "an[=10=]Example" ;
    System.out.println(
        Arrays.toString(
            input.codePoints().toArray()
        )
    );

看到这个 code run live at IdeOne.com。注意第三个位置的零,一个空字符,后面是单词“Example”的七个字符。

[97, 110, 0, 69, 120, 97, 109, 112, 108, 101]

避免char

切勿使用 char 类型。该类型从 Java 2 开始就已经遗留,基本上已损坏。作为 16 位值,char 在物理上无法表示大多数字符。

代码点

改用 code point 整数。

StringBuilder sb = new StringBuilder() ;
for( int codePoint : input.codePoints().toArray() ){
    if( ! Character.isISOControl( codePoint ) ) {
        sb.appendCodePoint( codePoint ) ;
    }
 }
String output = sb.toString() ;

转储到控制台。

System.out.println( output ) ;
System.out.println( Arrays.toString( output.codePoints().toArray() ) ) ;
}
System.out.println( output.codePoints().mapToObj( Character :: toString ).toList() ) ;

看到这个code run live at IdeOne.com

anExample

[97, 110, 69, 120, 97, 109, 112, 108, 101]

[a, n, E, x, a, m, p, l, e]

假设我们必须输入以下字符串:

String str = "an[=10=]Example";

我们可以使用常规循环和字符串生成器替换控制字符:

String replacement = "another";
StringBuilder stringBuilder = new StringBuilder();
for (char c : str.toCharArray()) {
    stringBuilder.append(Character.isISOControl(c) ? replacement : c);
}
String result = stringBuilder.toString();

或者我们可以使用流:

String result = str.chars()
        .mapToObj(c -> Character.isISOControl(c) ? replacement : String.valueOf((char)c))
        .collect(Collectors.joining());

请注意,根据isISOControl方法,这个an/0Example不包含任何类型的控制字符。而不是 /0,我相信你会想要这个 [=16=].