Ответ 1
попробуйте
str = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(str);
У меня есть следующее значение в строковой переменной в Java, которая имеет символы UTF-8, закодированные, как показано ниже
Dodd\u2013Frank
вместо
Dodd–Frank
(Предположим, что у меня нет контроля над тем, как это значение присваивается этой строковой переменной)
Теперь, как я могу его правильно преобразовать (закодировать) и сохранить в переменной String
?
Я нашел следующий код
Charset.forName("UTF-8").encode(str);
Но это возвращает ByteBuffer
, но я хочу вернуть String
.
Edit
Дополнительная информация.
Когда я использую System.out.println(str);
, я получаю
Dodd\u2013Frank
Я не уверен, что такое правильная терминология (UTF-8 или unicode). Простите меня за это.
попробуйте
str = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(str);
Вы можете воспользоваться тем фактом, что java.util.Properties поддерживает строки с escape-последовательностями '\ uXXXX' и делает что-то вроде этого:
Properties p = new Properties();
p.load(new StringReader("key="+yourInputString));
System.out.println("Escaped value: " + p.getProperty("key"));
Неэлегантный, но функциональный.
Вы можете преобразовать этот байтовый буфер в 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 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 position to its original so it is not altered:
buffer.position(old_position);
}
catch (Exception e)
{
e.printStackTrace();
return "";
}
return data;
}
Предположим, что у вас есть значение Unicode, например 00B0 (символ степени или надстрочный символ "o", как в аббревиатуре испанского языка для "primero" )
Вот функция, которая делает именно то, что вы хотите:
public static String unicodeToString( char charValue )
{
Character ch = new Character( charValue );
return ch.toString();
}
Я использовал StringEscapeUtils.unescapeXml
, чтобы освободить строку, загруженную из API, которая дает результат XML.