Интерпретировать строку из одной кодировки в другую в 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(), который ищет следующее слово по умолчанию.