Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сравнение строк
 
 автор: vtos   (19.11.2009 в 12:20)   письмо автору
 
 

Всем привет!

В чем, собственно, вопрос: строки, содержащие одно и тоже количество символов, а точнее - одни и те же символы, воспринимаются всеми операторами сравнения, строковыми функциями и пр. как РАЗНЫЕ строки...

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

Вот пример: имеем две одинаковые строки 'N-0903', одна из которых получена из одной базы, а вторая - из другой базы...Для одной из этих строк функция strlen() дает длину 6, а для другой - 9...
То есть похоже на то, будто бы эти строки в разных кодировках, потому и длина получается разная... Но, повторюсь, кодировка в обоих базах установлена в UTF-8...
Подскажите хотя бы, куда смотреть и где искать решение...
Заранее благодарен, если кто заинтересуется вопросом...

  Ответить  
 
 автор: emme_lated   (19.11.2009 в 12:25)   письмо автору
 
   для: vtos   (19.11.2009 в 12:20)
 

блин ,очень интересно.Я бы проверил строку на \n \r и &nbsp...Может записывает дополнительные симовлы.
Кусочек кода дай,чисто порешать подумать...

  Ответить  
 
 автор: vtos   (19.11.2009 в 12:59)   письмо автору
 
   для: emme_lated   (19.11.2009 в 12:25)
 

emme_lated, код там элементарен по своей сути, там просто в определенный момент обработки данных, полученных из базы, производится сравнение элементов массива... Код тут ничего не скажет. А проблема была в том, о чем было написано в самом же вопросе...
В одну из баз данные поступают путем загрузки CSV-файла. Так вот, вбив в эту базу эту самую строку 'N-0903' вручную, а не через загрузку csv-файла, я "сделал" ее равной той строке, из другой базы...Теперь их сравнение закончилось положительным результатом, т.е. теперь они равны! Т.е. через "ручной" ввод (т.е. через phpmyadmin) данные попали в базу в "нужной" кодировке.

К тому же оказалось, что я поторопился утверждать, что все файлы у меня в UTF-8, т.е. сами скрипты. Не все они были в этой кодировке, ошибся я... Значит, все же кодировки "поехали", в этом вся и проблема. Но она уже решается!

Спасибо всем, кто заинтересовался!

  Ответить  
 
 автор: Trianon   (19.11.2009 в 12:34)   письмо автору
 
   для: vtos   (19.11.2009 в 12:20)
 

bin2hex()

  Ответить  
 
 автор: vtos   (19.11.2009 в 13:01)   письмо автору
 
   для: Trianon   (19.11.2009 в 12:34)
 

Спасибо, интересная функция, она может быть полезна.

  Ответить  
 
 автор: heed   (19.11.2009 в 13:03)   письмо автору
 
   для: vtos   (19.11.2009 в 12:20)
 

Не должно такого быть
, если данные на самом деле одинаковые, пусть даже базы хранят их в разной кодировке
, сервер возвращает их в ккодировке установленной переменной character_set_client
или может поменять её, если получит запрос 'SET NAMES "cp1251"'

В течении одного соединения с одним сервером
два результата могут прийти в разных кодировках
только если между запросами отправлялось что-то вроде SET NAMES

  Ответить  
 
 автор: vtos   (19.11.2009 в 13:10)   письмо автору
 
   для: heed   (19.11.2009 в 13:03)
 

А как происходит сравнение строк в строковых функциях php? Побайтово ведь, это так? А если строки в разных кодировках хранятся, то и их длина, и вообще представление будут ведь разными?
Неужели, сравнив, например strcmp() две строки в разных кодировках, мы получим совпадение? Особенно, если одна из кодировок - UTF-8... Там ведь по два байта на символ...

  Ответить  
 
 автор: emme_lated   (19.11.2009 в 13:14)   письмо автору
 
   для: vtos   (19.11.2009 в 13:10)
 

ну вбил ты вручную строку,А в чем проблема то была?? думаю строки были типа "N-093" и "N-093 " ..
то есть лишние пробелы

  Ответить  
 
 автор: vtos   (19.11.2009 в 13:24)   письмо автору
 
   для: emme_lated   (19.11.2009 в 13:14)
 

Не было пробелов там.
Просто именно функции php для работы со строками и просто оператор сравнения "видели" эти строки разными...
Проблема была в том, что либо сам файл csv, либо файл со скриптом, который грузит csv в базу, были не в utf-8. Данные были загружены какое-то время назад, и получилось так, что они не в той кодировке туда попали, хотя отображались корректно... Можт смутно объяснил, но все же дело в этом...

  Ответить  
 
 автор: emme_lated   (19.11.2009 в 16:40)   письмо автору
 
   для: vtos   (19.11.2009 в 13:24)
 

Кстати может дело в кодировке самой страницы.Я когда сохраняю index.php -спрашивают,или в виндовс или в utf-8 или koir-8....Вибираю виндовс1251...Чето такое.

  Ответить  
 
 автор: cheops   (19.11.2009 в 16:11)   письмо автору
 
   для: vtos   (19.11.2009 в 12:20)
 

Посмотрите символ тире - он разный бывает, покороче, подлинее, ещё длинее - это разные символы - возможно в этом дело.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования