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

时间:2012-12-04 10:04:10

标签: java unicode utf-8 utf8-decode

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

8 个答案:

答案 0 :(得分:50)

尝试

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

来自Apache Commons Lang

答案 1 :(得分:14)

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

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

不雅,但功能齐全。

答案 2 :(得分:0)

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

这是一个可以满足你想要的功能:

             txToken = tx;

            string query = string.Format("cmd =_notify-synch&tx={0}&at={1}",txToken,authToken);

            string url = WebConfigurationManager.AppSettings["test_url"];

            HttpWebRequest reqs =  (HttpWebRequest) WebRequest.Create(url);

            reqs.Method = "POST";

            reqs.ContentType = "application/x-www-form-urlencoded";

            reqs.ContentLength = query.Length;

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            StreamWriter outStrmWriter = new StreamWriter(reqs.GetRequestStream(), Encoding.ASCII);

            outStrmWriter.Write(query);

            outStrmWriter.Close();

            StreamReader reader = new StreamReader(reqs.GetResponse().GetResponseStream());

            strReponse = reader.ReadToEnd();

            reader.Close();

            if (strReponse.StartsWith("SUCCESS"))
            {
                return strReponse;
            }
            else
            {
                return string.Empty;
            }
        }

答案 3 :(得分:0)

我使用StringEscapeUtils.unescapeXml取消了从提供XML结果的API加载的字符串。

答案 4 :(得分:0)

来自UnicodeUnescaper

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

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

答案 5 :(得分:0)

试试

<块引用>

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

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

答案 6 :(得分:-1)

您可以将该字节缓冲区转换为String,如下所示:

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

答案 7 :(得分:-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