ФорумПрограммированиеБольше языковJava → Проблемы с кодировками(рэгекспы).

Проблемы с кодировками(рэгекспы).

  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 12 сентября 2011 г. 6:50

    Есть такая ситуация.
    Как известно, Нетбинс(я не знаю, но по-моему и другие тоже) держит все исходники в юникоде по дефолту.
    Все бы хорошо… Но вот если у меня входящий поток(InputStream) в текстовом представлении, закодированный, например в кириллицу(windows-1251)…
    Как мне с ним работать, к примеру, посредством регескповых инструментов? Когда я в паттерне задаю русские символы, система посылает меня нахер ибо, видимо, видит в шаблоне крокозябры…

    Есть класс Charset, при помощи которого можно задать явно кодировку (текстовым)данным и типа с ними дальше так работать… Я задавал, но…
    При конвертации системная консоль возвращает знаки вопроса, регексповый парсер дальше посылает в лес..

    Пробловал и по файлах как тут
    http://xahlee.org/java-a-day/convert_charset.html

    но все без толку…

    Возможно проблема в том что в коде плохо распознаются кирилличные символы..




  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 12 сентября 2011 г. 7:01, спустя 10 минут 47 секунд

    iconv не пробовал?

    ну или через костыли:
    mb_internal_encoding('Windows-1251');
    mb_ereg_match(…)
    Спустя 50 сек.
    Ой разделом ошибся
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 12 сентября 2011 г. 8:37, спустя 1 час 35 минут 37 секунд

    Я думаю что копать надо на уровне простого вывода кирилличных символов в системную консоль.
    Странно, но у меня они выводятся знаками вопроса…
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 12 сентября 2011 г. 9: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
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 12 сентября 2011 г. 9: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();
    }


    Я открываю этот файл нетбинсом та как он подефолту и читает юникод (так как бы и читала програма на сколько я понимаю)… но в ответ получаю крокозябры и знаки вопросов…
    Я ж ведь задаю явно кодировку кирилличную и вывожу поток в юникод…
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 12 сентября 2011 г. 9:39, спустя 9 минут 29 секунд

    а ларчик просто блядь открывается: открой в сп1251 и конвертни в ютф. а дальше регулярки. программисты блеядь
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 12 сентября 2011 г. 9: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
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 12 сентября 2011 г. 11:49, спустя 1 час 50 минут 20 секунд

    Nyaah, Спасибо… только вот правда у меня систем а начала распознавать переконверченные символы когда я считывал строками и явно добавил следующее:

    new String(line.getBytes(), "UTF-8");


    А так просто с файла где переконверченный текст система понимать не хочет…

Пожалуйста, авторизуйтесь, чтобы написать комментарий!