8

我有一个字符串“\\u003c”,它属于 UTF-8 字符集。由于存在双反斜杠,我无法将其解码为 un​​icode。我如何从“\\u003c”中得到“\\u003c”?我正在使用java。

我试过了,

myString.replace("\\\\", "\\");

但无法实现我想要的。

这是我的代码,

String myString = FileUtils.readFileToString(file);
String a = myString.replace("\\\\", "\\");
byte[] utf8 = a.getBytes();

// Convert from UTF-8 to Unicode
a = new String(utf8, "UTF-8");
System.out.println("Converted string is:"+a);

文件的内容是

\u003c

4

7 回答 7

8

您可以使用String#replaceAll

String str = "\\\\u003c";
str= str.replaceAll("\\\\\\\\", "\\\\");
System.out.println(str);

它看起来很奇怪,因为第一个参数是一个定义正则表达式的字符串,并且在字符串文字\正则表达式中都是一个特殊字符。要真正将 a放入我们的搜索字符串中,我们需要在文字中对它 ( ) 进行转义。但要真正将 a放入正则表达式中,我们还必须在正则表达式级别对其进行转义。因此,要从字面上输入一个字符串,我们需要写入字符串字面量;为了让正则表达式引擎得到两个字面量,我们也需要对它们进行转义,所以我们最终得到. 那是:\\\\\\\\\\\\\\\\\\\\

字符串文字字符串含义到正则表达式
------------------------------------------------------ −−−−−−−−−−−−−−−−
\ 转义下一个字符 取决于下一个字符
\\ \ 转义下一个字符
\\\\ \\ 字面量 \
\\\\\\\\ \\\\ 字面意思 \\

在替换参数中,即使它不是正则表达式,它仍然会特别处理\$- 因此我们也必须在替换中转义它们。因此,要在替换中获得一个反斜杠,我们需要在该字符串文字中添加四个。

于 2016-06-19T02:28:19.467 回答
6

不确定您是否仍在寻找问题的解决方案(因为您有一个已接受的答案),但我仍会将我的答案添加为所述问题的可能解决方案:

String str = "\\u003c";
Matcher m = Pattern.compile("(?i)\\\\u([\\da-f]{4})").matcher(str);
if (m.find()) {
    String a = String.valueOf((char) Integer.parseInt(m.group(1), 16));
    System.out.printf("Unicode String is: [%s]%n", a);
}

输出:

Unicode String is: [<]

Here is online demo of the above code

于 2012-06-13T15:41:34.220 回答
4

关于“用单反斜杠替换双反斜杠”或更一般地,“用\不同的简单字符串替换包含 的简单字符串\”的问题(这不完全是 OP 问题,而是其中的一部分):

该线程中的大多数答案都提到replaceAll,这是此处工作的错误工具。更简单的工具是replace,但令人困惑的是,OP 声明replace("\\\\", "\\")对他不起作用,这也许就是所有答案都集中在replaceAll.

给有 JavaScript 背景的人的重要提示请注意,replace(CharSequence, CharSequence)在 Java 中确实替换了所有出现的子字符串 - 与 JavaScript 不同,它只替换第一个!

用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。

另一方面,replaceAll(String regex, String replacement)更多文档也在这里- 将这两个参数视为比常规字符串更多:

请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。

(这是因为\并且$可以用作对捕获的正则表达式组的反向引用,因此如果您想按字面意思使用它们,则需要转义它们)。

换句话说, 和 的第一个和第二个参数的replace行为replaceAll不同。因为replace您需要\在两个参数中加倍(字符串文字中反斜杠的标准转义),而在 中replaceAll,您需要将其加倍!(标准字符串转义 + 函数特定转义)

综上所述,对于简单的替换,一个应该坚持replace("\\\\", "\\")(它只需要一个转义,而不是两个)。

https://ideone.com/ANeMpw

System.out.println("a\\\\b\\\\c");                                 // "a\\b\\c"
System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\\\"));  // "a\b\c"
//System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\"));  // runtime error
System.out.println("a\\\\b\\\\c".replace("\\\\", "\\"));           // "a\b\c"

https://www.ideone.com/Fj4RCO

String str = "\\\\u003c";
System.out.println(str);                                // "\\u003c"
System.out.println(str.replaceAll("\\\\\\\\", "\\\\")); // "\u003c"
System.out.println(str.replace("\\\\", "\\"));          // "\u003c"
于 2018-04-26T15:57:02.570 回答
3

另一种选择,捕获两个斜线之一并将两个斜线替换为捕获的组:

public static void main(String args[])
{
    String str = "C:\\\\";
    str= str.replaceAll("(\\\\)\\\\", "$1");

    System.out.println(str);
} 
于 2015-06-22T23:31:30.283 回答
1

尝试使用,

myString.replaceAll("[\\\\]{2}", "\\\\");

于 2018-09-13T06:18:13.213 回答
0

这是用于将双反斜杠替换为单反斜杠

public static void main(String args[])
{
      String str = "\\u003c";
      str= str.replaceAll("\\\\", "\\\\");

      System.out.println(str);
}
于 2012-06-13T09:55:01.240 回答
0

"\\u003c"根本不“属于 UTF-8 字符集”。它是五个UTF-8 字符:' \'、'0'、'0'、'3' 和 'c'。这里真正的问题是为什么那里有双反斜杠?或者,他们真的存在吗?您的问题可能完全不同吗?如果字符串"\\u003c"在您的源代码中,则在运行时根本没有双反斜杠,无论您的问题是什么,它都不涉及在存在双反斜杠的情况下进行解码。

于 2012-06-13T10:26:56.973 回答