Java:如何将UTF-8(在字面上)转换为Unicode

3

我有一个UTF-8编码(字面上)的文本,像这样"\xE2\x80\x93."

我想用Java将其转换为Unicode。

但是我找不到方法将其转换。

有人能帮助我吗?

谢谢, Sat


你需要将字符串解析为 char[],然后将其转换为你想要的 String - Luiggi Mendoza
byte[]构造函数是解决您问题的答案。必要时,请提供字符集名称。 - Marko Topolnik
你的输入内容不太清楚。类似于 String input = "\xE2\x80\x93"; 这样的吗? - axtavt
"\xE2\x80\x93." 在Java中不是有效的字符串字面量。在Java中,所有字符串字面量都是UTF-16。您能否更明确地说明您正在获取数据的位置? - McDowell
2个回答

2
System.out.println(new String(new byte[] {
    (byte)0xE2, (byte)0x80, (byte)0x93 }, "UTF-8"));

打印一个破折号,这就是那三个字节所编码的内容。从你的问题中并不清楚你是否有这样的三个字节,还是仅仅拥有你所发布的字符串。如果你拥有该字符串,那么可以事先将其解析为字节,例如使用以下方法:

final String[] bstrs = "\\xE2\\x80\\x93".split("\\\\x");
final byte[] bytes = new byte[bstrs.length-1];
for (int i = 1; i < bstrs.length; i++)
  bytes[i] = (byte) ((Integer.parseInt(bstrs[i], 16) << 24) >> 24);
System.out.println(new String(bytes, "UTF-8"));

Marko 给出的解决方案对我有效。谢谢 Marko。 - Sat
@Sat 你知道如何接受答案吗?这是你在StackOverflow上应该做的,而不是留下描述性评论。你只需要点击答案左侧的勾号即可。 - Marko Topolnik
为什么后面跟着 << 24>> 24 - Beryllium
@Beryllium 这是关于在降级为“byte”之前的符号扩展的问题。 - Marko Topolnik
@Marko 我有一个字符串,其中包含UTF-8值"We celebrate the ideas \xE2\x80\x93"。 - Sat

2

您可以使用Apache Commons Lang StringEscapeUtils

或者,如果您知道字符串始终为\xHH\xHH,则可以:

String hex = input.replace("\x", "");
byte[] bytes = hexStringToByteArray(hex);
String result = new String(bytes, "utf-8");

hexStringToByteArray是在这里

还可以看看这个其他的SO 答案


我们正在使用Hadoop HBase表来存储数据,当数据存储到HBase表中时,它以这种格式存储:\xE2\x80\x93。当我们尝试使用StringEscapeUtils和其他一些工具将其转换为Unicode时,没有任何帮助。 - Sat
1
你尝试过我的另一个建议了吗?即手动将\xHH转换为字节数组,然后解码? - Ayman
@Marko 我有一个字符串,其中包含UTF-8值"We celebrate the ideas \xE2\x80\x93"。如果我的字符串包含"We celebrate the idea\xE2\x80\x93s",我使用正则表达式将其替换为0x。这样它看起来像"We celebrate the idea0xE20x80x93s"。有没有办法解析这个数据并仅获取十六进制值? - Sat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接