FPC+TStringList+UTF8

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: FPC+TStringList+UTF8

Сообщение vitaly_l » 28.03.2018 15:04:21

Vadim писал(а):При перекодировке в 1251 или в 866 тоже все сравнения с шаблоном происходят прекрасно.

Из вышеприведённой вашей фразы, становится понятно:
ошибка в вашем коде, т.к. для поиска в UTF8 и 1251 - алгоритмы поиска отличаются. Соответственно, если бы ВДРУГ ваш алгоритм был правильным, то всё должно было бы происходить - совсем наоборот. А именно при перекодировании в 1251 или 866 - должно было бы переставать работать, а у вас, оно(Ваше поделие) - наоборот ВДРУГ начинает работать...

Как высокохудожественное следствие - вывод:
В вашем алгоритме присутствует ошибка, соответствующая диссонансу от консонанса по отношению к длине волны буквы в UTF и 1251, связанные с явным непониманием Вами работы кодировок и кодировок в принципе. Покажите ваш алгоритм "поиска" форуму и вам тут же, все кому не лень - расскажут про ваши ошибки и объяснят суть отсутствия гармонии в фальши. И всем станет понятно, почему Ваша фальшь - вызывает диссонанс, а моя правда вызывает консонанс, т.к. моя правда созвучна 440 Гц.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: FPC+TStringList+UTF8

Сообщение Vadim » 29.03.2018 10:02:18

Ichthyander писал(а):То есть объясните вот эту Вашу проблему более развернуто

Условно говоря:
Код: Выделить всё
{$mode objfpc}{$H+}
{$codepage UTF8}

Var
  Шаблон: string;
  НаборСтрокИзСервера: TStringList;
  Найдено: Boolean;
Begin
  ...
  Найдено := False;
  Шаблон := 'Пенсионер';
  For i:=0 To НаборСтрокИзСервера.Count-1 Do
    If НаборСтрокИзСервера[i] = Шаблон Then
      Найдено := True
End;

Кодировка исходного кода программы - UTF8.
В Линуксе находит, в винде - нет. Данные в "НаборСтрокИзСервера" и там и там идентичные.

Добавлено спустя 9 минут 1 секунду:
vitaly_l
Художникам, единственная цель жизни которых - впаривать людям свою мазню, выдавая её за шедевр, высказываться в этой теме не обязательно.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 29.03.2018 10:59:57

Пока все равно непонятно в чем проблема. Тем более, если TStringList текст в UTF81. Для начала я бы попробовал вот три пункта ниже
1) Попробуйте убрать директиву {$codepage UTF8} из модуля. Зачем она? У меня и так всегда UTF8 и в Windows и Linux
2) Проверьте кодировку модуля в Lazarus. (правая кнопка - Параметры файла - Кодировка - UTF8) Должно быть именно UTF8, а не UTF8 с BOM
3) Попробовать функцию SameText/SameStr из модуля StrUtils.
Добавьте для дебагга вот это
Код: Выделить всё

Begin
  ...
  Найдено := False;
//{$IFDEF DEBUG}
  НаборСтрокИзСервера.SaveToFile('наборы строк.txt');
//{$ENDIF}
  Шаблон := 'Пенсионер';
  For i:=0 To НаборСтрокИзСервера.Count-1 Do
    If НаборСтрокИзСервера[i] = Шаблон Then
      Найдено := True

После чего откройте его в любом чуть более-менее продвинутом редакторе кода с возможностью выбора кодировки. Убедиться, что там UTF8

Добавлено спустя 1 минуту 44 секунды:
4) В строке шаблоне точно нет платформенно зависимых символов типа переноса строки?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение vitaly_l » 29.03.2018 11:05:19

Vadim писал(а):В самом TStringList кодировка строк 100% UTF-8. К примеру, если сделать Utf8ToAnsi() - то в винь кодировке я читаю то, что там хранится.
При перекодировке в 1251 тоже все сравнения с шаблоном происходят прекрасно.

Шаблон := 'Пенсионер';

Вот это Ваше странное слово: 'Пенсионер', указанное в виде литерала - часом не из контрола ли Вами берётся или не из CMD?
В смысле почему оно, слово: 'Пенсионер' - у Вас в кодировке 1251, в то время как в стринг-листе 100% UTF8?
Как так получилось?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: FPC+TStringList+UTF8

Сообщение Vadim » 29.03.2018 13:43:32

Ichthyander
Для меня, честно говоря, это тоже непонятно.
1) {$codepage UTF8} изначально у меня и не было, я его ввёл уже потом, когда столкнулся с проблемой.
2) Кодировка текста, совершенно точно, UTF8 без всяких BOM. Я работаю в редакторе FARа, т.к. приложение консольное, а он, если в файле присутствует BOM, его в начале файла всегда показывает в виде обычного текста.
3) Ок, попробую...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение vitaly_l » 29.03.2018 14:47:42

Vadim писал(а):Я работаю в редакторе FARа, т.к. приложение консольное

Вы в fare команды для программы пишите русскими буквами? Верно?

Соответственно, вот здесь, при сравнении, получаются разные кодировки:
Код: Выделить всё
If НаборСтрокИзСервера[i] = Шаблон Then ...


Слово: 'Пенсионер' в far набираете или оно зашито в коде ?
Если зашито в коде, то проверяйте кодировку модуля, т.к. из базы Вы 100% получаете Utf8 в соответствии с проверкой вами UTF8ToAnsi().


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: FPC+TStringList+UTF8

Сообщение Vadim » 29.03.2018 15:30:02

vitaly_l
Голубчик, Вам одного предупреждения мало? Не несите здесь всякую чухню, проявите милосердие...

Добавлено спустя 21 минуту 34 секунды:
Ichthyander
Всем спасибо за внимание, ошибка нашлась в другом месте и вскрылась как раз без {$codepage UTF8}, уж не знаю даже почему. :-)
При заполнении БД на сервере тамошние товарищи повставляли в строки символы перевода строки, видимо с целью затруднения обработки данных сторонними прогами. :-D Теперь я просто перед запуском нужного мне техпроцесса предварительно удаляю во всём TStringList лишние символы.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Ichthyander » 29.03.2018 16:03:47

Ну так в 4) пункте я и спросил об этом ;) viewtopic.php?p=130913#p130913

Добавлено спустя 1 минуту 27 секунд:
Набор символов для перевода строки в Linux и WIndows разные, хотя переменная LineEnding, к примеру, одна. Значения для которой подставляется в зависимости от того для какой ОС компилится
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: FPC+TStringList+UTF8

Сообщение pupsik » 29.03.2018 16:17:43

А.. "Шаблон " у вас из командной строки, или из файла? Если командная строка - там не будет ютф8. CP866 - поверю. А вот ютф8 командной строки в винде... Как то не сильно. В лине - почти всегда ютф8 командной строки. Возможно из-за этого у вас "в лине - работает, в винде -нет".

Плюс "="... в принципе можно так сравнивать строки. Но разве это способ сравнения строк?

Добавлено спустя 5 минут 53 секунды:
повставляли в строки символы перевода строки
после каждой буквы, или только затронуты строки?
... предварительно удаляю во всём TStringList лишние символы.
- хм... "=" не работает и utf8pos не валиден?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: FPC+TStringList+UTF8

Сообщение Vadim » 29.03.2018 16:25:46

Ichthyander писал(а):Набор символов для перевода строки в Linux и WIndows разные

Да нет, не в этом дело. Их было излишне много, что одна (логическая) строка могла быть представлена и в виде двух-трёх строк... :-)

pupsik писал(а):А.. "Шаблон " у вас из командной строки, или из файла?

Нет, значения "Шаблон" у меня зашиты прямо в код программы, т.к. они изменяться никогда не будут. Ну, к примеру, трудно предположить, что как-нибудь в будущем появится, наряду с существующими "Инвалид 1, 2 и 3 группы" ещё и "Инвалид 4 группы". Хотя, конечно, в нашей стране не исключено... :-)

pupsik писал(а):Плюс "="... в принципе можно так сравнивать строки. Но разве это способ сравнения строк?

Привык к простоте. ;-) А Вы что хотите предложить?

Добавлено спустя 3 минуты 45 секунд:
pupsik писал(а):и utf8pos не валиден?

Отчего же, конечно валиден. Просто надо было строку целиком сравнивать с шаблоном.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение pupsik » 29.03.2018 16:50:55

Привык к простоте...
А разве это способ???

Просто надо было строку целиком сравнивать с шаблоном.
судя по 'Пенсионер'... Это похоже на простое сравнение строк. Никак не сравнения по шаблону.

1.Напишите функцию точного сравнения строк. От силы час (кофе там, фильмец посмотреть ещё). Ну или найдите в нете. И не будет сложности.
2.Пользуйтесь utf8pos. И не появятся "злостные админы" из-за которых не получается сравнить строку с помощью "=".

Добавлено спустя 1 минуту 58 секунд:
по поводу "злостных админов"... чёт терзают смутные сомнения о верности вашего вывода:
При заполнении БД на сервере тамошние товарищи повставляли в строки символы перевода строки
.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: FPC+TStringList+UTF8

Сообщение Vadim » 29.03.2018 18:32:47

pupsik писал(а):чёт терзают смутные сомнения

Меня тоже... :-) Дело в том, что согласно разработанной и утверждённой высокими и мудрыми начальниками спецификации, в получаемых данных ничего подобного "переводу строки" быть не должно... :-D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение pupsik » 29.03.2018 19:57:46

Vadim я не знаю как эти данные у вас появляются. Возможно, где то "сидит" мелкая бага. Т.е., в момент добавление откуда то, идёт добавление "лишние символы". Возможно это "способность" базы, сервера. Да много чего возможно.
Ну нет в этом ничего такого. Сравнивайте строки по "учебнику" и не будет сложностей.
Кстати: п.1. - возможно comparestr поможет.

п.с.
Одно мне не ясно. Первоначально был виноват "список" (сохранял не верно).... Знч. у вас ещё что то в коде есть, где происходит замена, или ещё что то о чём забыли упомянуть. Ведь сохраняется список не валидно. Или уже нормально?

Добавлено спустя 14 минут 28 секунд:
Ну и мелочь: "Пенсионер" <> "пенсионер" с точки зрения "компа". Или ошибаюсь?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: FPC+TStringList+UTF8

Сообщение Vadim » 30.03.2018 07:56:09

pupsik писал(а):Первоначально был виноват "список" (сохранял не верно)....

Первоначально была немного расширенная задача. Предполагалось делать текстовый лог, а потом по нему собирать статистику. Но оказалось, что статистика нужна не только нашему подразделению, поэтому её разработку отдали ребятам, которые программируют сервер и она будет получаться отдельным запросом к серверу.
Сначала я думал что неверный вывод кодировки UTF8 в текстовый файл и невозможность поиска текста в списке - это ошибки из одной оперы. Но я ошибся... :-)
pupsik писал(а):я не знаю как эти данные у вас появляются.

Будете смеяться, но я тоже не знаю, как эти данные, уже в таком, неправильном виде, у меня появляются. :-D Я делаю запрос на веб-сервер и ответ помещается в TStringList. Согласитесь, очень мала вероятность, что дополнительные переносы строки мне добавляет протокол TCP\IP или известный британский шалун, матершиник и любитель юных дев Борька Джонсон... :-D Мы сейчас с серверным подразделением пытаемся выяснить этот вопрос.
pupsik писал(а):Ну и мелочь: "Пенсионер" <> "пенсионер" с точки зрения "компа".

С точки зрения компа - да, Вы совершенно правы. С точки зрения согласованного протокола формы предоставления данных, "пенсионер" с маленькой буквы - ошибка. Это значение в базе подставляется из справочника, не вручную.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FPC+TStringList+UTF8

Сообщение Cheb » 30.03.2018 13:45:41

https://notepad-plus-plus.org/ - и забудьте родной виндовый как страшный сон. Тут вам и с бом, и без бом, и вкладки, и преферанс, и блудницы.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru
cron