【问题标题】:How to exclude an escape character from being treated as an escape character如何排除转义字符被视为转义字符
【发布时间】:2016-05-11 13:00:29
【问题描述】:

我有一个 Java 字符串

String t = "Region S\u00FCdost SER";

其中 \u00FC 是 unicode 字符“ü”的替代品

如果我在上面的字符串中添加一个新的转义字符,我仍然希望我的下面的函数能够转义除当前之外的其他字符。

例如,以下函数在重新运行时将在后续迭代中返回结果为“Region S\\u00FCdost SER”和“Region S\\\\u00FCdost SER”。

我们如何防止这种情况发生?

public static String escapeString(String str)
    {
        StringBuffer result = new StringBuffer();

        // char is 16 bits long and can hold an UTF-16 code        
        // i iterate on chars and not on code points
        // i guess this will be enough until we need to support surrogate pairs 
        for (int i = 0; i < str.length(); i++)
        {
            char c = str.charAt(i);
            switch (c) {

            case '"':
                result.append("\\\""); //$NON-NLS-1$
                break;
            case '\b':
                result.append("\\b"); //$NON-NLS-1$
                break;
            case '\t':
                result.append("\\t"); //$NON-NLS-1$
                break;
            case '\n':
                result.append("\\n"); //$NON-NLS-1$
                break;
            case '\f':
                result.append("\\f"); //$NON-NLS-1$
                break;
            case '\r':
                result.append("\\r"); //$NON-NLS-1$
                break;
            case '\'':
                   result.append("\\'"); //$NON-NLS-1$   

                break;
            case '\\':

                result.append("\\\\"); //$NON-NLS-1$

                break;

            default:
                if (c < 128)
                {
                    //is ascii
                    result.append(c);
                }
                else
                {
                    result.append(
                            String.format("\\u%04X", (int) c)); //$NON-NLS-1$
                }
            }
        }

        return result.toString();
    }
}

【问题讨论】:

  • 你不能,编译器在创建二进制文件之前会更改所有 Unicode 符号 \uXXXX 及其正确的字符,因此在二进制文件中 String t ü 结尾,而不是 \u00FC。 (这也是为什么我们可以写//\u000a System.out.println("hello");之类的评论并在屏幕上看到hello
  • @Pshemo 也许他正在将字符串作为运行时输入传递
  • @Hackerdarshi 我的假设是基于“我有一个 Java 字符串 String t = "Region S\u00FCdost SER";”。如果该字符串来自某个外部资源,该资源显式发送字符\urestOfUnicode,那么问题应该提到它。
  • @Hackerdarshi 如果他在运行时传递字符串Region S\u00FCdost SER,那么Java字符串文字应该是Region S\\u00FCdost SER,在这种情况下你会得到\\,然后是\\\\,等等结果。
  • @Andreas AFAIK 没有。 "如果他在运行时传递了字符串 Region S\u00FCdost SER,那么 Java 字符串文字应该是 Region S\\u00FCdost SER" 正确。但是,`\` 会被转义!所以,“在这种情况下,你会得到 \\,然后是 \\\\,等等结果”不。

标签: java string unicode escaping


【解决方案1】:

你可以这样做:

case '\\':
    if(str.charAt(i+1)!='u')
        result.append("\\\\");
    else 
        result.append("\\");
break;

假设\u 将始终在您的字符串中表示一个 unicode 字符序列。

【讨论】:

  • 该方法永远不会看到\uXXXX序列,因为原始字符串已经被编译器转义,所以该方法看到的字符串是"Region Südost SER"
  • @Andreas 正如我在对该问题的评论中所说,“也许他正在将字符串作为运行时输入传递”......
  • \u 是否总是表示 Unicode?我的解决方案与您提到的完全相似。有没有更清洁的方法来处理这个问题? :) 如果不是,我可以提取 \u 后面的 3 个字符来检查它是否是解码后的 Unicode,除了你提到的吗?
【解决方案2】:

当您将 Java 字符串文字编写为 "Region S\u00FCdost SER" 时,Java 编译器会将其解释为字符串值 Region Südost SER,这就是在 t 上调用 escape() 方法时所看到的。

如果你想要字符串Region S\u00FCdost SER,你应该转义\,即"Region S\\u00FCdost SER"

如果你继续运行escape() 方法,我相信你会看到你想要的。

String s = "Region S\u00FCdost SER";
System.out.println(s); // print original text
for (int i = 0; i < 4; i++) {
    s = escapeString(s);
    System.out.println(s);
}

输出:

Region Südost SER                           <-- original text
Region S\u00FCdost SER
Region S\\u00FCdost SER
Region S\\\\u00FCdost SER
Region S\\\\\\\\u00FCdost SER

如果您将输入更改为"He'd say: \"Bitte schön\"",您会得到:

He'd say: "Bitte schön"                     <-- original text
He\'d say: \"Bitte sch\u00F6n\"
He\\\'d say: \\\"Bitte sch\\u00F6n\\\"
He\\\\\\\'d say: \\\\\\\"Bitte sch\\\\u00F6n\\\\\\\"
He\\\\\\\\\\\\\\\'d say: \\\\\\\\\\\\\\\"Bitte sch\\\\\\\\u00F6n\\\\\\\\\\\\\\\"

我的意思是,这就是你想要的,对吧?如果没有,请通过实际显示您想要的示例输出来澄清问题。

【讨论】:

  • 好的。我的问题更多的是防止在字符串输入中添加额外的转义符,正如您在输入更改中提到的那样。如何以编程方式防止这种情况发生?
  • 不知道你说的“防止添加额外的转义”是什么意思。如果字符串包含\ 并且该方法应该转义字符串,则每个 \ 变为\\。这意味着 3 \ 变为 6 \。这就是它应该工作的方式,所以双重和三重转义字符串会导致许多反斜杠。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
相关资源
最近更新 更多