如果我从文件中读取,如何将ASCII(Unicode转义)字符串转换为Unicode(UTF-8)?

3

编辑:

我正在从文件中读取该字符串,因此这个话题实际上是关于以下问题:

我有一个字符串,它与从文件接收到的字符串相等:equal()

"Diogo Pi\\u00e7arra - Tu E Eu"

如何让Java将结果字符串"\u00e7"读取为字符"ç"?

这是因为文件不是以UTF-8编码,而是以转义Unicode编码,所以我将"\u00e7"读取为字符串而不是Unicode字符。因此,我需要一个在运行时解析它的函数。我可以使用.replace()函数迭代来解析它,但是......


旧问题(之前提问方式有误,请忽略以下文字):

我有以下字符串:

final String str = "Diogo Pi\u00e7arra - Tu E Eu";

我希望将其转换为:

并且我想将其转换为:

"Diogo Piçarra - Tu E Eu"

我已经尝试了各种方法,从Apache Lang工具的unescape函数到...

new String(str.getBytes("UTF-16"), "UTF-16")

或者

new String(str.getBytes("UTF-8"), "UTF-8")

或者

new String(str.getBytes("UTF-16"))

或者

new String(str.getBytes("UTF-8"))

但是什么都没有起作用...!

接下来我该尝试什么?

谢谢!


你得到了什么值 System.getProperty("file.encoding") - Andrew Tobilko
这个:ANSI_X3.4-1968 - PedroD
2个回答

4
我把它运作起来的方式如下:从一个包含明确编写的转义Unicode的文件中读取。
    BufferedReader reader1 = new BufferedReader(new InputStreamReader(file.getInputStream()));
    byte c;
    while ((c = (byte) reader1.read()) != -1) {
        output.append(new String(new byte[] { c }, "UTF-8"));
    }
    return StringEscapeUtils.unescapeJava(output.toString());

这是可行的,因为
StringEscapeUtils.unescapeJava("Diogo Pi\\u00e7arra - Tu E Eu")
results in "Diogo Piçarra - Tu E Eu"

1
请将此答案标记为已接受的答案,因为当前标记的答案没有回答问题。此外,您的问题似乎不需要 UTF-8,因为 Java 字符串是 UTF-16。 - Tom Blodget

-1
final String str = new String("Diogo Pi\u00e7arra - Tu E Eu".getBytes(), 
                              Charset.forName("UTF-8"));

结果:

尝试使用getBytes()方法而不带参数(这里将使用defaultCharset)。但这并非必需。不需要进行转换:
final String str = "Diogo Pi\u00e7arra - Tu E Eu";

你将会得到相同的结果。


它在我的机器上不起作用,但在IDEONE上可以工作,甚至不需要进行转换:http://ideone.com/B3dwD9 - PedroD
@PedroD,看看这个。你的JVM存在一种编码错误。 - Andrew Tobilko
@PedroD,之后请告诉我结果。 - Andrew Tobilko
现在,通过将标志-Dfile.encoding=utf-8添加到我的Java命令,它返回的是utf-8而不是ANSI_X3.4-1968,但错误仍然存在。问题是我正在从文件中读取一个转义字符串(我无法更改)。我正在读取的等同于“Diogo Pi\u00e7arra - Tu E Eu”。我需要做的是强制Java将字符串“\u00e7”读取为Unicode特殊字符。我可以使用.replace()来实现,但我想这样做就像重新发明轮子一样... - PedroD
这个答案有多个错误:1. 在Java源代码中,"\u00e7"和"ç"在每个方面都是相同的。2. getBytes() 是依赖于语言环境的,并且可能会不可逆地损坏数据。3. 即使语言环境使用UTF-8,new String(x.getBytes(), Charset.forName("UTF-8")) 仍将等于 x。4. 无论如何,您都应该使用 StandardCharsets.UTF8 - Karol S
显示剩余4条评论

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