Как победить кодировку UTF-8 в Java?

Есть задача:
Дано: файл, в котором есть символы в кодировке UTF-8. Символы произвольные.
Нужно: получить строку заданной длины из заданного места в файле и отобразить в консоль.

Проблема возникла в том, что используя класс RandomAccessFile я получаю набор байт, а после конвертации в строку я получаю 1 лишний символ (зависит о того, захватил ли я пробел или нет).

Подскажите, пожалуйста, как произвести нормальное декодирование из массива байт в строку в UTF-8?

Пример строки в файле: Спасибо, что ты есть

Код:
public class Main {

    public static final int CHARS_PER_PAGE = 19;

    public static void main(String[] args) {
        System.out.println(getPage("test.txt", 0));
    }

    public static String getPage(String filePath, int pageNum) throws IOException {
        int startPos = CHARS_PER_PAGE * pageNum;
        byte[] pageBytes = new byte[CHARS_PER_PAGE];

        RandomAccessFile raf = new RandomAccessFile(filePath, "r");

        raf.seek(startPos);
        raf.read(pageBytes, 0, CHARS_PER_PAGE);

        System.out.println("Bytes Array: " + Arrays.toString(pageBytes));
        System.out.println("Result String: " + new String(pageBytes, StandardCharsets.UTF_8));

        raf.close();

        return new String(pageBytes, StandardCharsets.UTF_8);
    }
}
  • Вопрос задан
  • 595 просмотров
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
Как в общем читать UTF-8 строку из файла:
https://dzone.com/articles/read-utf-8-file-java
BufferedReader in = new BufferedReader(new FileReader("file"));
while( (s = in.readLine()) != null) {
	String UTF8Str = new String(s.getBytes(),"UTF-8"));
}

Нужно: получить строку заданной длины из заданного места в файле
Дело в том, что при кодировании текста в UTF-8 каждый произвольный символ из таблицы Unicode может кодироваться заранее неизвестным количеством октетов. Для кириллицы на каждый символ приходится 2 октета, если не ошибаюсь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы