Преобразовать экранированный символ Unicode обратно в реальный символ

У меня есть следующее значение в строковой переменной в 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 ответов

Решение

Пытаться

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

от Apache Commons Lang

Вы можете воспользоваться тем, что java.util.Properties поддерживает строки с escape-последовательностями '\uXXXX' и делать что-то вроде этого:

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

Не элегантный, но функциональный.

пытаться

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

поскольку org.apache.commons.lang3.StringEscapeUtils устарел.

Возможно следующее решение, которое правильно декодирует строку без каких-либо дополнительных зависимостей.

Это работает в 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

Я использовал StringEscapeUtils.unescapeXml чтобы удалить строку, загруженную из API, который дает результат XML.

UnicodeUnescaper из org.apache.commons:commons-text тоже приемлемо.

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

Предположим, у вас есть значение Unicode, например, 00B0 (символ градуса или верхний индекс "o", как в испанском сокращении "primero")

Вот функция, которая делает именно то, что вы хотите:

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

    return ch.toString();
}

Вы можете преобразовать этот байтовый буфер в строку следующим образом:

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;
 }
Другие вопросы по тегам