【问题标题】:Java code to process special characters that need to be replaced by other special characters处理需要被其他特殊字符替换的特殊字符的Java代码
【发布时间】:2023-12-26 22:46:02
【问题描述】:

我正在编写 Java 代码来处理从大型机接收到的字符串,该字符串包含需要被其他特殊字符替换的特殊字符,我的搜索字符是 §ÄÖÜäüßö@[\]~{¦},替换字符是 @[\]{}~¦§ÄÖÜßäöü,所以如果字符串有{ 在其中我需要用ä 替换它,我的输入示例是"0.201322.05.2017LM-R{der Dopp"

我的代码目前是

        String repChar = "§ÄÖÜäüßö@[\\\\]~{¦}@[\\\\]{}~¦§ÄÖÜßäöü";
        // Split String and Convert
        String repCharin = repChar.substring(0, repChar.length()/2-1);
        String repCharout = repChar.substring(repChar.length()/2, repChar.length()-1);          
        String strblob = new String(utf8ContentIn);
        // Convert  
        for (int j=0; j < repCharin.length();j++) {
            strblob = strblob.replace(repCharin.substring(j, 1), repCharout.substring(j, 1));                               
        }
        byte [] utf8Content = strblob.getBytes();

但它会产生以下错误

java.lang.StringIndexOutOfBoundsException 在 java.lang.String.substring(String.java:1240)

\\ 是转义字符,我只需要一个 \

【问题讨论】:

  • 您收到错误是因为您在更改字符串的同时通过字符串的长度进行循环。
  • 哪一行抛出异常?我能说的是strblob = strblob.replace(repCharin.substring(j, 1), repCharout.substring(j, 1)); 可能是strblob = strblob.replace(repCharin.substring(j, j+1), repCharout.substring(j, j+1));
  • 我建议获取这些字符的字节表示并在字节模式收集中完全工作,而不是使用字符串操作。记住一些用多字节编码的字符。
  • 初始化repCharinrepCharout.substring 调用都是错误的——它们提取的字符串太短了一个字符。您应该抛弃这种废话,只需使用正确的字符串文字直接初始化 repCharinrepCharout,恕我直言。

标签: java string special-characters


【解决方案1】:

代码

    String utf8ContentIn = "0.201322.05.2017LM-R{der Dopp";

    String repChar = "§ÄÖÜäüßö@[\\]~{¦}@[\\]{}~¦§ÄÖÜßäöü";
    // Split String and Convert
    String repCharin = repChar.substring(0, repChar.length() / 2);
    String repCharout = repChar.substring(repChar.length() / 2, repChar.length());
    String strblob = new String(utf8ContentIn);

    String output = strblob.chars().mapToObj(c -> {
        char ch = (char) c;
        int index = repCharin.indexOf(c);
        if (index != -1) {
            ch = repCharout.charAt(index);
        }
        return String.valueOf(ch);
    }).collect(Collectors.joining());

    System.out.println(output);

将按照您的预期打印"0.201322.05.2017LM-Räder Dopp"。您在这里的问题(除了在分离期间不正确的索引)是您应该迭代输入字符串而不是您的字符。因为当您将Ä 替换为[ 并在威胁[ 再次作为特殊字符并再次将其替换为Ä 时,您可能会遇到这种情况。

另外,单反斜杠应该用单反斜杠转义,所以要获得\,你需要\\

希望对你有帮助!

【讨论】:

    最近更新 更多