java 将转义Unicode字符转换回实际字符

yr9zkbsy  于 2023-06-20  发布在  Java
关注(0)|答案(8)|浏览(210)

我在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)。请原谅

h22fl7wq

h22fl7wq1#

尝试

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

Apache Commons Lang

im9ewurl

im9ewurl2#

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"));
ctehm74n

ctehm74n3#

尝试
str = org.apache.commons.text.StringEscapeUtils.unescapeJava(str);
因为org.apache.commons.lang3.StringEscapeUtils已弃用。

vwoqyblh

vwoqyblh4#

假设您有一个Unicode值,例如00B0(度数符号,或上标'o',如西班牙语中'primero'的缩写)
下面是一个函数,它可以做你想要的:

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

    return ch.toString();
}
g52tjvyc

g52tjvyc5#

我使用StringEscapeUtils.unescapeXml来取消转义从API加载的字符串,该API提供XML结果。

xam8gpfp

xam8gpfp6#

org.apache.commons:commons-textUnicodeUnescaper也是可以接受的。
new UnicodeUnescaper().translate("Dodd\u2013Frank")

cxfofazt

cxfofazt7#

也许下面的解决方案可以正确解码字符串而不需要任何额外的依赖关系。
这在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
798qvoo8

798qvoo88#

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

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;
 }

相关问题