Форум → Программирование → Больше языков → Java → Проблемы с кодировками(рэгекспы).
Проблемы с кодировками(рэгекспы).
-
Есть такая ситуация.
Как известно, Нетбинс(я не знаю, но по-моему и другие тоже) держит все исходники в юникоде по дефолту.
Все бы хорошо… Но вот если у меня входящий поток(InputStream) в текстовом представлении, закодированный, например в кириллицу(windows-1251)…
Как мне с ним работать, к примеру, посредством регескповых инструментов? Когда я в паттерне задаю русские символы, система посылает меня нахер ибо, видимо, видит в шаблоне крокозябры…
Есть класс Charset, при помощи которого можно задать явно кодировку (текстовым)данным и типа с ними дальше так работать… Я задавал, но…
При конвертации системная консоль возвращает знаки вопроса, регексповый парсер дальше посылает в лес..
Пробловал и по файлах как тут
http://xahlee.org/java-a-day/convert_charset.html
но все без толку…
Возможно проблема в том что в коде плохо распознаются кирилличные символы.. -
12 сентября 2011 г. 15:01, спустя 10 минут 47 секунд
iconv не пробовал?
ну или через костыли:
mb_internal_encoding('Windows-1251');
mb_ereg_match(…)Спустя 50 сек.Ой разделом ошибся -
12 сентября 2011 г. 16:37, спустя 1 час 35 минут 37 секунд
Я думаю что копать надо на уровне простого вывода кирилличных символов в системную консоль.
Странно, но у меня они выводятся знаками вопроса… -
12 сентября 2011 г. 17:18, спустя 41 минуту 35 секунд
Да не, как по ссылке в первом посте должно работать, наверно деёствительно все таки кирилица у тебя в консоль неверно выводится:
Для файлаpublic class JavaApplication31 {
public static void main(String[] args) {
try {
File file = new File("/home/alexander/test_cp1251.txt");
FileInputStream stream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(stream, "windows-1251");
char[] buffer = new char[1024];
reader.read(buffer, 0, 1024);
stream.close();
Pattern pattern = Pattern.compile("(тест\\d+)");
Matcher matcher = pattern.matcher(new String(buffer));
while (matcher.find()) {
System.out.format("match:\"%s\" [%d:%d]%n", matcher.group(), matcher.start(), matcher.end());
}
}
catch (UnsupportedEncodingException ex) {
Logger.getLogger(JavaApplication31.class.getName()).log(Level.SEVERE, null, ex);
}
catch (FileNotFoundException ex) {
Logger.getLogger(JavaApplication31.class.getName()).log(Level.SEVERE, null, ex);
}
catch (IOException ex) {
Logger.getLogger(JavaApplication31.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
тест1
тест2тест3
тест4
выдаёт:match:"тест1" [2:7]
match:"тест2" [8:13]
match:"тест3" [13:18]
match:"тест4" [19:24]Спустя 31 сек.попробуй вывести в файл результат, может в нём не будет вопросиков )Work, buy, consume, die -
12 сентября 2011 г. 17:30, спустя 11 минут 40 секунд
Nyaah, Спасибо… но проблема у меня в том что я немогу сконвертировать кириллицу в юникод…
К черту ту консоль - не с ней мне надо работать вообщемто(планируется gui написать)…File fo = new File("C:/VKOutput.html");
InputStream is = null;
try {
is = method.getResponseBodyAsStream();
} catch (IOException ex) {
ex.printStackTrace();
}
InputStreamReader isr = null;
try {
isr = new InputStreamReader(is, "windows-1251");//cp1251 пробовал тоже но без толку
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
Writer w = null;
try {
w = new OutputStreamWriter(new FileOutputStream(fo),"UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
int x;
try {
while ((x = isr.read()) != -1) {
w.write(x);
}
} catch (IOException ex) {
ex.printStackTrace();
}
try {
isr.close();
is.close();
w.close();
} catch (IOException ex) {
ex.printStackTrace();
}
Я открываю этот файл нетбинсом та как он подефолту и читает юникод (так как бы и читала програма на сколько я понимаю)… но в ответ получаю крокозябры и знаки вопросов…
Я ж ведь задаю явно кодировку кирилличную и вывожу поток в юникод… -
12 сентября 2011 г. 17:39, спустя 9 минут 29 секунд
а ларчик просто блядь открывается: открой в сп1251 и конвертни в ютф. а дальше регулярки. программисты блеядьСапожник без сапог -
12 сентября 2011 г. 17:59, спустя 19 минут 23 секунды
хм, попробовал как у тебя по одному символу, получилась какая-то фигня, скопировал буффером, стало все окей:File file = new File("/home/alexander/test_cp1251.txt");
FileInputStream stream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(stream, "windows-1251");
char[] buffer = new char[1024];
int bufferLength = 0, x;
OutputStreamWriter w = null;
w = new OutputStreamWriter(new FileOutputStream("/home/alexander/test_utf8.txt"), "UTF-8");
/*
while ((x = stream.read()) != -1) {
w.write(x);
}*/
do {
bufferLength = reader.read(buffer, 0, 1024);
w.write(buffer, 0, bufferLength);
} while (bufferLength == 1024);
stream.close();
w.close();Work, buy, consume, die -
12 сентября 2011 г. 19:49, спустя 1 час 50 минут 20 секунд
Nyaah, Спасибо… только вот правда у меня систем а начала распознавать переконверченные символы когда я считывал строками и явно добавил следующее:
new String(line.getBytes(), "UTF-8");
А так просто с файла где переконверченный текст система понимать не хочет…
Пожалуйста, авторизуйтесь, чтобы написать комментарий!