веб-сканер java не может распознать неанглийские символы

Я просмотрел список фильмов и сохранил их в своей базе данных. Все работает нормально для фильмов, содержащих только английские символы, но проблема в том, что некоторые названия фильмов, которые содержат не английские символы, не могут отображаться правильно. Например, итальянский фильм «Il più crudele dei giorni» хранится как «Il pi & ugrave; crudele dei giorni».

Может ли кто-нибудь любезно сообщить мне, есть ли какое-либо решение? (Я знаю, что могу установить язык для сканера, я уже просматривал названия фильмов на итальянском языке, но когда я хочу сканировать заголовки на английском языке, в Imdb все еще есть фильмы, в которых есть не английские символы)

ИЗМЕНИТЬ: Вот мой код:

String baseUrl = "http://www.imdb.com/search/title?at=0&count=250&sort=num_votes,desc&start="+start+"&title_type=feature&view=simple";

label1:  try {

     org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21").header("Accept-Language", "en");
     con.timeout(30000).ignoreHttpErrors(true).followRedirects(true);
     Response resp = con.execute();
     Document doc = null;

     if (resp.statusCode() == 200) {

         doc = con.get();                                       

         Elements myElements = doc.getElementsByClass("results").first().getElementsByTag("table");
         Elements trs = myElements.select(":not(thead) tr");

         for (int i = 0; i < trs.size(); i++) {

             Element tr = trs.get(i);
             Elements tds = tr.select("td");

             for (int j = 3; j < tds.size(); j++) {

                 Elements links = tds.select("a[href]");
                 String titleId = links.attr("href");
                 String movietitle = links.html();    

                  //I ADDED YOUR CODE HERE
                   Charset c = Charset.forName("UTF-16BE");

                        ByteBuffer b = c.encode(movietitle);
                        for (int m = 0; b.hasRemaining(); m++) {
                            int charValue = (b.get()) & 0xff;
                            System.out.print((char) charValue);
                        }   

               // try{    

                //   String query = "INSERT into test (movieName,ImdbId)" + "VALUES (?,?)";
    //               PreparedStatement preparedStmt = conn.prepareStatement(query);
    //               preparedStmt.setString (1, movietitle);
      //               preparedStmt.setString (2, titleId );
       //          }catch (Exception e)
        //       {
        //           e.printStackTrace();
        //       }

Спасибо,


person mOna    schedule 05.10.2014    source источник
comment
joelonsoftware.com/articles/Unicode.html   -  person Tirath    schedule 06.10.2014
comment
@Tirath: Спасибо за полезную статью. Собственно, Movietitle я получил и храню в БД. Должен ли я добавлять строки кодировки после сохранения названия фильма в String movietitle ?. Не могли бы вы увидеть мое обновление, чтобы увидеть исходный код?   -  person mOna    schedule 06.10.2014
comment
@Tirath: даже добавив эти строки кодирования, я все равно получаю тот же результат :( Не могли бы вы помочь мне, я действительно запутался   -  person mOna    schedule 06.10.2014
comment
Не работали с IO. Можете попробовать использовать PrintStream класс. Используйте PrintStream(OutputStream out,boolean autoFlush,String encoding) конструктор и напишите в консоль. Если это не сработает, попробуйте вместо этого записать в файл.   -  person Tirath    schedule 06.10.2014
comment
Код в порядке. Это консоль, на которую вы печатаете, вызывает проблему. Я просто попробовал его в eclipse, и он напечатал поля для акцентированных символов. Итак, лучше попробуйте записать в файл и посмотреть результат.   -  person Tirath    schedule 06.10.2014


Ответы (1)


Здесь я скопировал вставленную строку, указанную в вопросе, и попробовал

public class Test {
    public static void main (String...a) throws Exception {
        String s = "Il più crudele dei giorni";
        Charset c = Charset.forName("UTF-16BE");

        ByteBuffer b = c.encode(s);
        for (int i = 0; b.hasRemaining(); i++) {
            int charValue = (b.get()) & 0xff;
            System.out.print((char) charValue);
        }
    }
}

Это напечатает s в том виде, в каком он находится на консоли. Я предполагаю, что у вас уже есть часть кода, который записывает в файл. Вы можете попробовать интегрировать приведенный выше код, если он вам подходит.

person Tirath    schedule 05.10.2014
comment
спасибо за помощь, есть все равно не ползать с самого начала? (Поскольку существует 100 000 фильмов ... Я имею в виду, есть ли способ изменить и обновить их в базе данных? - person mOna; 05.10.2014
comment
Все, о чем я могу думать, это написать отдельный класс, который будет читать column values из рассматриваемого table и обновлять его обратно в БД. - person Tirath; 05.10.2014
comment
Я пробовал ваш код, но у меня не получилось .. ничего не вышло :( - person mOna; 05.10.2014
comment
ничего такого? не печатает как есть - понятно. - person Tirath; 05.10.2014
comment
извините, но я не понял ... Я подумал, что он должен вернуть Il più crudele dei giorni ... не могли бы вы объяснить е немного больше?: | - person mOna; 06.10.2014