【问题标题】:In java, is there a way to convert a control character to a set of characters in a string?在java中,有没有办法将控制字符转换为字符串中的一组字符?
【发布时间】:2021-12-28 00:19:07
【问题描述】:

对不起,如果标题措辞不佳,但我正在尝试制作一个程序,它可以找到一种方法来检测字符串中的每个单独字符是否是控制字符。如果有一个控制字符,它应该用一组字符替换那个控制字符。例如,字符串“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');
        }
     }

【问题讨论】:

  • 您想创建自定义控制字符吗?还是您只想替换现有的?你的问题不清楚。
  • 你的意思是\0
  • “一个字符,除了控制字符,不能包含多个字符”——这是没有意义的。一个字符不“包含”字符,它一个字符。一个字符。不管是不是控制字符。
  • 哦,也许我明白了。您会感到困惑,因为在Java 源代码中 可以通过序列反斜杠字母-n 来表示单个字符(如“换行符”)。它仍然是字符串中的一个 16 位字符。这只是为非打印字符提供符号方便。

标签: java char


【解决方案1】:

假设我们必须跟随输入字符串:

String str = "an\0Example";

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

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,我相信你会想要这个\0

【讨论】:

    【解决方案2】:

    编译器处理的转义

    嵌入在字符串文字中的转义由编译器处理,并转换为预期的字符。所以在运行时,字符串对象包含一个空值,并且 not 包含一个反斜杠和零在你的文字 "an\0Example" 中看到。

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

        String input = "an\0Example" ;
        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

    一个例子

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2016-02-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2023-02-07
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多