Интерпретировать строку из одной кодировки в другую в Java

Я искал ответы на это (я уверен, что они там), и я не уверен, что это возможно.

Итак, я получил ОГРОМНЫЙ файл, который содержит слово "för". Я использую RandomAccessFile, потому что я знаю, где он находится (вид) и поэтому могу использовать функцию seek(), чтобы туда добраться.

Чтобы узнать, что я нашел его, в моей программе есть строка "för", которую я проверяю на равенство. Вот проблема, я запустил отладчик, и когда я добираюсь до "för", то сравниваю "f isr".

Так что моя программа завершается без поиска "för".

Это код, который я использую, чтобы получить слово:

    private static String getWord(RandomAccessFile file) throws IOException {
    StringBuilder stb = new StringBuilder();
    String word;
    char c;
    c = (char)file.read();
    int end;
    do {
        stb.append(c);
        end = file.read();
        if(end==-1)
            return "-1";
        c = (char)end;

    } while (c != ' ');
    word = stb.toString();
    word.trim();
    return word;
}

Таким образом, в основном я возвращаю все символы из текущей точки файла в первый символ ''. Так что в основном я получаю слово, но так как (char)file.read(); читает байт (я думаю), UTF-8 'ö' становится двумя символами 'Ã' и '¶'?

Одна из причин этого предположения заключается в том, что если я открою свой файл с кодировкой UTF-8, это будет "för", но если я открою файл с ISO-8859-15 в том же месте, мы получим именно то, что возвращает мой метод getWord: "fö р"

Итак, мой вопрос:

Когда я сижу с "för" и "f¶r", есть ли способ это исправить? Как сказать "читать" для ", как если бы это была строка UTF-8", чтобы получить "для"?

3 ответа

Решение
import java.nio.charset.Charset;
String encodedString = new String(originalString.getBytes("ISO-8859-15"), Charset.forName("UTF-8"));

Если вы должны использовать RandomAccessFile Вы должны прочитать содержимое в byte[] сначала, а затем преобразовать весь массив в String - что-то вроде:

byte[] buffer = new byte[whatever];
file.read(buffer);
String result = new String(buffer,"UTF-8");

Это только для того, чтобы дать вам общее представление о том, что делать, вам придется добавить некоторую обработку длины и т. Д.

Это не будет работать правильно, если вы начнете читать в середине последовательности UTF-8, но так же, как и любой другой метод.

Вы используете RandomAccessFile.read (). Это читает отдельные байты. UTF-8 иногда использует несколько байтов для одного символа.

Здесь обсуждаются различные методы чтения UTF-8 из файла RandomAccessFile: Java: чтение строк из файла произвольного доступа с буферизованным вводом

Если вам не обязательно нужен RandomAccessFile, вам определенно следует переключиться на чтение символов вместо байтов.

Если возможно, я бы предложил Scanner.next(), который ищет следующее слово по умолчанию.

Другие вопросы по тегам