Латинские символы между строкой
У меня есть программа для чтения в файле, который содержит латинские слова, такие как "\xed". Эти латинские слова могут появляться в любом месте между любыми строками, поэтому у меня есть программа для анализа этих символов. Есть ли библиотека, которая может это сделать?
2 ответа
Простой способ, которым я часто занимаюсь, - это InputStreamReader с форматом "UTF8". Например:
try {
File fileDir = new File("c:/temp/sample.txt");
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(fileDir), "UTF8"));
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
}
catch (UnsupportedEncodingException e)
{
System.out.println(e.getMessage());
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
Если вы имеете в виду, что текст в байтах, и у вас есть байт с шестнадцатеричным значением ED
то интерпретация этого байта зависит от вашей кодовой страницы.
Ява хранит все String
внутренне в UTF-16. Это означает, что преобразование кодовой страницы почти всегда применяется при чтении и записи файла (UTF-16 не является обычной кодировкой файла).
По умолчанию Java будет использовать набор символов платформы по умолчанию. Если это не правильно, вы должны указать Charset
использовать.
В качестве примера проблемы, байт ED
является:
- ISO-8859-1:
í
(юникода00ED
) США Windows - Windows-1251:
н
(юникода043D
) Русский - Кодовая страница 437:
φ
(юникода03C6
) Командная строка Windows для США (Win 7)
Чтобы управлять кодовой страницей, прочитайте файл следующим образом:
File file = new File("C:\\path\\to\\file.txt");
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "ISO-8859-1"))) {
String line;
while ((line = in.readLine()) != null) {
// process line here
}
}
Или с более новым Path
API:
Path path = Paths.get("C:\\path\\to\\file.txt");
try (BufferedReader in = Files.newBufferedReader(path, Charset.forName("ISO-8859-1"))) {
String line;
while ((line = in.readLine()) != null) {
// process line here
}
}