【发布时间】: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