Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > equal не срабатывает на одинаковых строках


Автор: Connie 8.10.2008, 19:15
Есть файл в UTF8, я читаю из него построчно. 
Если первая строка такая <MENU> то начинается дальнейшая обработка. Все вроде бы просто, надо сравнить первую строк со строковой константой
Вот код
Код


BufferedReader r=null;
try{
   r = new BufferedReader( new InputStreamReader
                    ( new FileInputStream
                       (fileSelector.getSelectedFile().getAbsolutePath()), "UTF8" ) );
     }
catch (IOException ex){
    System.out.println(ex.getMessage());
}

String line=null;
if (r!=null) line = getNextLine(r);

String test = "<MENU>";
System.out.println("Длина "+line.length());
System.out.println("Длина "+test.length());


for (int j=0; j<line.length();j++)  System.out.println(""+line.charAt(j) + ":"+(int)line.charAt(j));
for (int j=0; j<test.length();j++)  System.out.println(""+test.charAt(j) + ":"+(int)line.charAt(j));
                            
if (test.equals(line)) 
                                System.out.println("equals");

private String getNextLine(BufferedReader r){
     String l = null;
     try{
        l = r.readLine();
     } catch(IOException e){System.out.println(e.getMessage());}
     if (l!=null) l = l.trim();
     return l;
 }


А вот вывод
Цитата
Длина 7
Длина 6
:65279
<:60
M:77
E:69
N:78
U:85
>:62
<:65279
M:60
E:77
N:69
U:78
>:85
Почему так? Как сравнить внешне одинаковые строки?
                            

Автор: polosatij 8.10.2008, 20:51
Цитата(Connie @  8.10.2008,  19:15 Найти цитируемый пост)
Длина 7
Длина 6


ню ты намутил(а) smile 

в первой строчке, возможно, ещё и \n, то есть переход на новую строку, посему результат и +1..



Автор: Connie 8.10.2008, 22:05
polosatij
Хорошо, пробуем так
Код

String test = "\n<MENU>";


Цитата
Длина 7
Длина 7
:65279
<:60
M:77
E:69
N:78
U:85
>:62

:65279
<:60
M:77
E:69
N:78
U:85
>:62
все равно сравнение не проходит, но теперь виден перенос строки при выводе посимвольно строки test, а первая строка не дает такого эффекта  smile 

на всякий случай прилагаю этот файл. Нет там никакого переноса smile 

Автор: polosatij 8.10.2008, 23:41
Цитата(Connie @  8.10.2008,  22:05 Найти цитируемый пост)
Нет там никакого переноса


ню.. логично всё.. у тебя ведь перенос не в начале, а в конце  smile 

Код

    String test = "<MENU>\n";


 smile 


Автор: redrick 9.10.2008, 00:18
Bug ID:     4508058 =)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058

сталобыть скипать надо первые 3 байта

Автор: Connie 9.10.2008, 11:43
polosatij
http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()
Цитата
    Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

    Returns:
        A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
Нету переносов, нету smile


redrick, я в принципе и пошел по этому пути, не стал так сравнивать
line.equals("<MENU>"), а вместо этого line.contains("<MENU>")
Я так и предположил, что это какой то глюк в распозновании UTF, спасибо за ссылку

Автор: SoulKeeper 9.10.2008, 12:21
Цитата

In UTF-8, this is not really a "byte order" mark. It identifies the text as UTF-8 but doesn't say anything about the byte order, because UTF-8 does not have byte order issues


Для чего вообще в UTF-8 BOM пихать?

Автор: redrick 9.10.2008, 13:00
SoulKeeper
вот вроде оттудаже:

Цитата

While UTF-8 does not have byte order issues, a BOM encoded in UTF-8 may be used to mark text as UTF-8. It only identifies a file as UTF-8 and does not state anything about byte order.[1] Many Windows programs (including Windows Notepad) add BOM's to UTF-8 files. However in Unix-like systems (which make heavy use of text files for file formats as well as for inter-process communication) this practice is not recommended, as it will interfere with correct processing of important codes such as the hash-bang at the start of an interpreted script. It may also interfere with source for programming languages that don't recognise it. For example, gcc reports stray characters at the beginning of a source file, and in PHP, if output buffering is disabled, it has the subtle effect of causing the page to start being sent to the browser, preventing custom headers from being specified by the PHP script. The UTF-8 representation of the BOM is the byte sequence EF BB BF, which appears as the ISO-8859-1 characters  in most text editors and web browsers not prepared to handle UTF-8.


типа просто маркер что файл UTF-8.
Судя по всему это косяк который сделали и теперь не правят, т.к. боятся что у всех все сломается(баг 2001 года).
С другой стороны стандарту 100 лет и здесь сановцы просто налажали.

Автор: Alexander1966 10.10.2008, 13:09
Странно, у меня все верно проверяет. Для:

wwweeeee
<MENU>
wwwwwwwww

выдает:
no
yes
no


Код

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class testFile {

    public static void main(String[] args) {
        BufferedReader br;
        try {

            br = new BufferedReader(new InputStreamReader(new FileInputStream(
                    "test.txt"), "UTF8"));
            String s = null;
            while ((s = br.readLine()) != null) {
                if (s.equals("<MENU>"))
                    System.out.println("yes");
                else
                    System.out.println("no");
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Автор: alexadr 10.10.2008, 13:31
Alexander1966
а попробуй для вот такого контента файла UTF8 с BOM:
Код

<MENU>
wwweeeee
wwwwwwwww

Автор: redrick 10.10.2008, 15:08
Alexander1966
просто файл у вас видимо без BOMа как сказал alexadr

посмотрите хексэдитором

Автор: Connie 11.10.2008, 07:10
Alexander1966
Цитата
Странно, у меня все верно проверяет. Для:

wwweeeee
<MENU>
wwwwwwwww

В том и проблема, что сравнение не проходит, если <MENU> в первой строчке, а оно только там и должно быть, структура файла такая, если в первой строчке нет этой записи, то значит это не тот файл и дальнейшая обработка не производится.

Попробуйте сделать сравнение
line.equals("wwweeeee") так, что бы wwweeeee эта строчка была первой.

Там далее в файле есть еще одна похожая строчка <DATA> так вот с ней сравнение проходит.

При этом надо помнить, что формат того файла я поменять никак не смогу, т.к. он делается другой программой, т.е. работаю с тем, что есть.

Но впрочем я решение нашел, я написал выше, оно меня устраивает smile И оно хорошо тем, что если Sun исправят этот баг, то программу не потребуется переделывать. smile

Автор: ecologist 11.10.2008, 13:15
А почему исполь зуется FileStream - он же для побайтного считывания ?
Может лучше FileReader ? Я что-то не припомню таких проблем в этом случае.

Автор: Connie 11.10.2008, 18:13
ecologist, потому что нужно сделать конверсию UTF8, а уже поверх этого используется BufferedReader, а он то читает построчно.

Автор: Alexander1966 14.10.2008, 16:52
Работает и с первой строчкой.
Файл создаю в ASPLinux.  Midnight Commander
Locale=UTF-8.RU

без BOM - это точно

Автор: alexadr 15.10.2008, 21:56
Alexander1966, ну вот потому что он без BOM и все работаетsmile, если было бы с бомом, то у первой строчки из файла вначале было бы 3 байта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)