如何排除转义字符被视为转义字符

时间:2016-05-11 13:00:30

标签: java string unicode escaping

我有一个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();
    }
}

2 个答案:

答案 0 :(得分:0)

你可以这样做:

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

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

答案 1 :(得分:0)

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

如果你想要字符串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\\\\\\\\\\\\\\\"

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