String пытается стать последовательностью абстрактных символов, у него нет никакой кодировки с точки зрения ее пользователей. Конечно, он должен иметь внутреннюю кодировку, но это детализация реализации.
Нет смысла кодировать String как UTF-8, а затем декодировать результат как UTF-8. Он не будет оп, в том, что:
(new String(str.getBytes("UTF-8"), "UTF-8")).equals(str) == true;
Но есть случаи, когда строка абстракция разваливается и выше будет «с потерями» преобразованием. Из-за внутренних данных реализации строка может содержать непарные суррогаты UTF-16, которые не могут быть представлены в UTF-8 (или любое кодирование , в том числе внутреннее кодирование UTF-16 *). Таким образом, они будут потеряны в кодировке, и когда вы декодируете назад, вы получите исходную строку без недействительных непарных суррогатов.
Единственное, что я могу исправить из вашего вопроса, это то, что у вас есть результат строковой интерпретации двоичных данных как Windows-1255, где он должен был интерпретироваться в UTF-8. Чтобы исправить это, вам нужно перейти к источнику этого и явно использовать декодирование UTF-8.
Если вы, однако, проистекаете только из-за неправильной интерпретации строки, вы не можете ничего сделать, потому что столько байтов не имеют представления в Windows-1255 и не попали бы в строку.
Если бы это было не так, то вы могли бы полностью восстановить первоначальный намеченную сообщение от:
new String(str.getBytes("Windows-1255"), "UTF-8");
* Это на самом деле неправильно Java, чтобы позволить непарные суррогаты существовать в его струнных в первую очередь так как это не действует UTF-16
Вы можете посмотреть на это: http://stackoverflow.com/questions/4016671/how-to-parse-a-string-that-is-in -a-different-encoding-from-java – Danyel