Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> equal не срабатывает на одинаковых строках, При чтении из UTF8 файла 
:(
    Опции темы
Connie
Дата 8.10.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



Есть файл в 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
Почему так? Как сравнить внешне одинаковые строки?
                            
PM MAIL WWW   Вверх
polosatij
Дата 8.10.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



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


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

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





--------------------
PM   Вверх
Connie
Дата 8.10.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



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 

Это сообщение отредактировал(а) Connie - 8.10.2008, 22:11

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  food.zip 7,97 Kb
PM MAIL WWW   Вверх
polosatij
Дата 8.10.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



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


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

Код

    String test = "<MENU>\n";


 smile 




--------------------
PM   Вверх
redrick
Дата 9.10.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



Bug ID:     4508058 =)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058

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


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Connie
Дата 9.10.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



polosatij
http://java.sun.com/javase/6/docs/api/java...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, спасибо за ссылку
PM MAIL WWW   Вверх
SoulKeeper
Дата 9.10.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Цитата

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 пихать?
PM MAIL   Вверх
redrick
Дата 9.10.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



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 лет и здесь сановцы просто налажали.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Alexander1966
Дата 10.10.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.8.2008

Репутация: нет
Всего: нет



Странно, у меня все верно проверяет. Для:

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();
        }
    }
}


PM MAIL   Вверх
alexadr
Дата 10.10.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: 4
Всего: 4



Alexander1966
а попробуй для вот такого контента файла UTF8 с BOM:
Код

<MENU>
wwweeeee
wwwwwwwww

PM MAIL   Вверх
redrick
Дата 10.10.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



Alexander1966
просто файл у вас видимо без BOMа как сказал alexadr

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


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Connie
Дата 11.10.2008, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



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

wwweeeee
<MENU>
wwwwwwwww

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

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

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

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

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

PM MAIL WWW   Вверх
ecologist
Дата 11.10.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



А почему исполь зуется FileStream - он же для побайтного считывания ?
Может лучше FileReader ? Я что-то не припомню таких проблем в этом случае.
PM MAIL   Вверх
Connie
Дата 11.10.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 1
Всего: 9



ecologist, потому что нужно сделать конверсию UTF8, а уже поверх этого используется BufferedReader, а он то читает построчно.
PM MAIL WWW   Вверх
Alexander1966
Дата 14.10.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.8.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) Alexander1966 - 14.10.2008, 17:00

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  test.txt 0,02 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.