【问题标题】:Java backslash encode special characters like quote, tab, newline, backslash to make parseableJava 反斜杠对引号、制表符、换行符、反斜杠等特殊字符进行编码以使其可解析
【发布时间】:2013-12-06 02:26:46
【问题描述】:

我正在编写 Java,它获取诸如“C:\Temp\file.txt”之类的字符串并生成包含这些字符串的 C 源代码,稍后将编译代码。所以我需要以 C 编译器可以解析的形式呈现字符串;对于我的示例,将是“C:\\Temp\\file.txt”。当然字符串也可能有其他特殊字符。

基本上,我在 Java 中需要与此 SO 答案中讨论的相同功能:standard c library for escaping a string

NB Python 用“repr”提供了类似的东西,我想可能有一个 Java 库方法。但到目前为止我还没有找到它。提前致谢。

【问题讨论】:

    标签: java string


    【解决方案1】:

    我建议你看看 Apache Commons StringEscapeUtils,你可能会使用它 -

    StringEscapeUtils.escapeJava(str); // this will likely work for most cases.
    

    【讨论】:

      【解决方案2】:

      这是我解决问题的代码。非常受欢迎的改进。

      package my.package;
      
      public class ParseableStringHelper {
      
      /**
       * http://stackoverflow.com/questions/1029897/comparing-a-char-to-a-code-
       * point
       * 
       * Does not implement Iterator
       */
      static class CodePointIterator {
      
          private final String sequence;
          private int index = 0;
      
          public CodePointIterator(final String sequence) {
              this.sequence = sequence;
          }
      
          public boolean hasNext() {
              return index < sequence.length();
          }
      
          public int next() {
              int codePoint = sequence.codePointAt(index);
              index += Character.charCount(codePoint);
              return codePoint;
          }
      }
      
      /**
       * Converts a String to a version that can be parsed by a C or Java compiler
       * when enclosed in double quotes, which requires escaping all special
       * characters by prefixing them with a backslash. Does NOT do anything
       * special for single-quote characters (which are perfectly valid inside a
       * quoted string); always escapes double-quote characters.
       * 
       * http://docs.oracle.com/javase/tutorial/java/data/characters.html
       * 
       * @param internal
       *            String that may have special characters
       * @return String with proper escape sequences for special characters like
       *         backslash and newline.
       */
      public static String getParseableVersion(final String internal) {
          StringBuilder sb = new StringBuilder();
          CodePointIterator pointIterator = new CodePointIterator(internal);
          while (pointIterator.hasNext()) {
              int point = pointIterator.next();
              switch (point) {
              case '\b':
                  sb.append("\\b");
                  break;
              case '\f':
                  sb.append("\\f");
                  break;
              case '\n':
                  sb.append("\\n");
                  break;
              case '\r':
                  sb.append("\\r");
                  break;
              case '\t':
                  sb.append("\\t");
                  break;
              case '\\':
                  // double these up
                  sb.append("\\\\");
                  break;
              case '"':
                  sb.append("\"");
                  break;
              default:
                  sb.append(Character.toChars(point));
                  break;
              }
          }
          return sb.toString();
      }
      
      /**
       * Test the helper
       * 
       * @param args
       */
      public static void main(String[] args) {
          String[] tests = { "C:\\Temp\\file.txt",
                  "This has\tsome special characters\n" };
          for (String t : tests)
              System.out.println("Orig is " + t + ", parseable is \""
                      + getParseableVersion(t) + "\"");
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 2011-08-01
        • 2023-03-18
        相关资源
        最近更新 更多