Intent.getData() в UTF-8
Всем доброго времени!
Пишу приложение для открытия файлов через Intent.
Нужно достать путь к файлу способом Intent.getData(), а потом этим же способом перезаписать файл.
Впринцыпе все работает, если путь к файлу без пробелов и на латинице )
Проблема следующая: getData() заменяет пробелы и русские символы на %20%D0% и тд..
Соответственно при перезаписи создается новый файл с этим же %20%D0%-именем.
Кому не трудно, подскажите способ получать путь в кодировке UTF-8, и чтобы при этом у FileOutputStream не было проблем с перезаписью.
Заранее спасибо!
Ответы (2 шт):
У getData() нет проблем с кириллицей, это вы его неправильно интерпретируете.
Если посмотреть внимательно, то getData() возвращает Uri, соответсвенно все что не ANSI, кодируется по правилам URL encoding
https://en.wikipedia.org/wiki/Percent-encoding
Конвертируйте Uri в file path (не всегда возможно) и все будет как надо.
ADDON: Uri.getPath() сам все декодирует
String linkUtf8 = "https://site.com/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82/";
Uri uri = Uri.parse(linkUtf8);
System.out.println(uri.toString());
// >> https://site.com/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82/
System.out.println(uri.getPath());
// >> /ссылка куда-то ведет/
Как раз перед вашим ответом нашел этот способ:
Uri uri = intent.getData();
try {
String totalFile = new File(uri.toString());
String fpath = URLDecoder.decode(totalF.getCanonicalPath().toString(), "UTF-8");
} catch (IOException e) {
Toast.makeText(this, "Failed on reading File: " + e.toString(), Toast.LENGTH_LONG).show();
}