33

我在 Java 中的字符串变量中有以下值,它的 UTF-8 字符编码如下

Dodd\u2013Frank

代替

Dodd–Frank

(假设我无法控制如何将此值分配给此字符串变量)

现在如何正确转换(编码)它并将其存储回String变量中?

我找到了以下代码

Charset.forName("UTF-8").encode(str);

但这会返回一个ByteBuffer,但我想要一个String返回。

编辑

一些更多的附加信息。

当我使用System.out.println(str);我得到

Dodd\u2013Frank

我不确定什么是正确的术语(UTF-8 或 unicode)。请原谅我。

4

8 回答 8

60

尝试

str = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(str);

来自Apache Commons Lang

于 2012-12-04T10:16:56.667 回答
15

java.util.Properties

您可以利用java.util.Properties支持带有 '\uXXXX' 转义序列的字符串这一事实,并执行以下操作:

Properties p = new Properties();
p.load(new StringReader("key="+yourInputString));
System.out.println("Escaped value: " + p.getProperty("key"));

不优雅,但实用。

为了处理可能的情况IOExeception,您可能需要一个 try-catch。

Properties p = new Properties();
try { p.load( new StringReader( "key=" + input ) ) ; } catch ( IOException e ) { e.printStackTrace(); }
System.out.println( "Escaped value: " + p.getProperty( "key" ) );
于 2014-06-04T20:27:31.247 回答
0

假设您有一个 Unicode 值,例如 00B0(度数符号,或上标 'o',如西班牙语中 'primero' 的缩写)

这是一个可以满足您需求的功能:

public static String  unicodeToString( char  charValue )
{
    Character   ch = new Character( charValue );

    return ch.toString();
}
于 2016-06-30T18:31:06.987 回答
0

我曾经StringEscapeUtils.unescapeXml对从提供 XML 结果的 API 加载的字符串进行转义。

于 2016-10-26T14:42:57.967 回答
0

UnicodeUnescaperorg.apache.commons:commons-text也可以接受。

new UnicodeUnescaper().translate("Dodd\u2013Frank")

于 2020-11-04T19:51:29.250 回答
0

尝试

str = org.apache.commons.text.StringEscapeUtils.unescapeJava(str);

因为 org.apache.commons.lang3.StringEscapeUtils 已被弃用。

于 2021-06-11T06:40:43.030 回答
-1

也许以下解决方案可以正确解码字符串而无需任何其他依赖项。

这在 scala repl 中有效,但在仅 Java 的解决方案中应该同样有效。

import java.nio.charset.StandardCharsets
import java.nio.charset.Charset

> StandardCharsets.UTF_8.decode(Charset.forName("UTF-8").encode("Dodd\u2013Frank"))
res: java.nio.CharBuffer = Dodd–Frank
于 2018-10-24T20:42:23.563 回答
-2

您可以像这样将该字节缓冲区转换为字符串:

import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.ByteBuffer

public static CharsetDecoder decoder = CharsetDecoder.newDecoder();

public static String byteBufferToString(ByteBuffer buffer)
{
    String data = "";
    try 
    {
        // EDITOR'S NOTE -- There is no 'position' method for ByteBuffer.
        //                   As such, this is pseudocode.
        int old_position = buffer.position();
        data = decoder.decode(buffer).toString();
        // reset buffer's position to its original so it is not altered:
        buffer.position(old_position);  
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return "";
    }
    return data;
 }
于 2012-12-04T10:08:35.597 回答