Преобразовать экранированный символ 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 ответов
Вы можете воспользоваться тем, что 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;
}