Решено: Не могу избавится от пробела в строке

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

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

Решено: Не могу избавится от пробела в строке

Сообщение azsx » 01.09.2016 10:23:06

Есть строка, неизвестно в какой кодировке (в ней скорее всего есть неудобные для utf8символы). Я пока определиться точно не могу, поэтому сокращаю строку до ansi, а потом преобразовываю ее обратно в utf8, чтобы в бд записать. Проблема в том, что у меня в строках остаются пробелы справа. Я уже:
Код: Выделить всё
  vrem_ansi := utf8toansi(vrem_str);
  vrem_ansi := trim(vrem_ansi);
  vrem_str := ansitoutf8(vrem_ansi);
  vrem_str := utf8trim(vrem_str);

  if (utf8pos(' ', vrem_str) = 0) and (length(utf8trim(vrem_str)) = 3) and (pos(chr(32), vrem_str) = 0) then begin

и всё равно остаются пробелы справа. Приходится их запрещать на уровне БД, а это очень долго. На самом деле методом тыка я перепробовал разные варианты.
Вопрос, почему у меня не получается очистить пробел (символ 32)?
Последний раз редактировалось azsx 02.09.2016 13:44:54, всего редактировалось 1 раз.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 01.09.2016 11:12:37

Есть строка, неизвестно в какой кодировке (в ней скорее всего есть неудобные для utf8символы)
может там иные "не удобные" символы? Вы преобразуете неизвестную кодировку как ютф8 в анси... Но..о: если кодировка неизвестна.... почему ютф8???

Код: Выделить всё
//  vrem_ansi := utf8toansi(vrem_str);
//  vrem_ansi := trim(vrem_ansi);
//  vrem_str := ansitoutf8(vrem_ansi);
  vrem_str := utf8trim(vrem_str);//если она ютф8...

  if (utf8pos(' ', vrem_str) = 0) and (utf8length(utf8trim(vrem_str)) = 3) and
(pos(chr(32), vrem_str) = 0)// ????  Т.е. всё в кучу. И телеги, и кони. Ещё цикла не хватает :)
then begin


п.с.
Идеальное решение: если не знаю в какой кодировке строка то она в ютф8 :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Не могу избавится от пробела в строке

Сообщение serge#LVL » 01.09.2016 14:25:21

особо не работал с utf8, поэтому может не в тему скажу. Попробуйте TrimRightSet или TrimSet. С AnsiString правые пробелы и любые символы можно подавить с помощью SetLength(), указав новую длину строки без "правых хвостов".
Не понял, что такое "неудобные символы", но может поэтому trim не работает, что в конце строки есть что-то кроме пробела.
serge#LVL
новенький
 
Сообщения: 13
Зарегистрирован: 19.08.2016 13:17:36

Re: Не могу избавится от пробела в строке

Сообщение vada » 01.09.2016 14:48:52

Есть строка, неизвестно в какой кодировке

- Как это кодировка не известна? Что делать со строкой с неизвестной кодировкой да еще и с БД. Фигня какая-то.
- Trim помогает удалить ведущие и замыкающие пробелы, но кодировку надо знать.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Не могу избавится от пробела в строке

Сообщение azsx » 01.09.2016 18:45:29

может там иные "не удобные" символы?

да всяко разно пытался найти, не могу ничо понять. Нету ничего!!! У меня вот мысль, в С конец строки завершается ноликом. Я могу в fpc как то конечный ноль удалить (если предположить, что он там есть)? Строка if pos ('#0', vrem_str) > 0 then writeln ('tut nol'); ничего не находит.
vrem_str := utf8trim(vrem_str);//если она ютф8...

ваша строка также не работает. Иногда, пробел остается.
if (utf8pos(' ', vrem_str) = 0) and (length(utf8trim(vrem_str)) = 3) and (pos(chr(32), vrem_str) = 0) then begin

я получается не понятно написал. То есть я сперва тремя командами по любому поводу чищу строку на три символа от пробелов. Затем пытаюсь отверить условием, что в строке нет пробелов. Строка проходит по условию, типа пробелов нет! А на самом деле пробел есть!!!
Мне пришлось при создании таблицы указать check (my_str not like '% %'). И вот по этой проверке в БД идет отказ на запись данных, так как в записи есть пробел. Если что строки в текстовой файл я также выводил. Ага, есть там пробел, 32 код. Почему его trim не убирает - загадка.
---
serge#LVL ваши способы все попробовал, не помогают.
vada, вот так мне не легко, не знаю я кодировку.Поэтому я пытаюсь ее в ansi перегнать, чтобы быть уверенным, что кодировка мне известна теперь. А так, да, я верю людям и рассчитываю увидеть там utf8.
---
Не понял, что такое "неудобные символы"

FE..FF невозможны при кодировании вплоть до 31 бита У первого байта символа устанавливается столько старших битов, сколько байтов отводится под символ. Их конец обозначается терминальным битом 0, а оставшиеся биты соответствуют старшим битам значения. Байты 254 и 255 в двоичной системе: 111111102 и 111111112 соответствуют длинам 7 и 8, а длина 31 бит может быть закодирован шестью байтами.
https://ru.wikipedia.org/wiki/UTF-8
Я короче сам ничо в этих кодировках не понимаю. Образно, ситуация такая. Естьв utf8 такие пары (тройки) байт которые не корректны при перекодировке. fpc (будь он неладен) обрабатывает их. А как куда такие кодировки выпускаем - так хоть разревись, например, постгрес их блокирует (будь он неладен дважды). В своих предыдущих постах с божьей помощью и вашими усилиями я наловчился конвертировать такие пары так, что на 100 тысяч строк только пара с ошибками остается. Все остальные пишутся в базу. Но вот при обратном чтении (внезапно) не всегда всё хорошо и возможно снова чо то не так со строками. Или я чего то не понимаю.
---
Как это кодировка не известна?

я копирую все главные и роботсы в интернете (чо мелочится). На сайтах часто врут про кодировку в тегах и ответах сервера; с сайтов очень часто распростроняют бинарные данные (как я понимаю ехе вирусы) напрямую со страницы; азиаты и исламисты живут в каком то другом мире с другими, отличными от европейских кодировками; сайты сами по себе имеют проблемы. Вкратце, я понятия не имею какая кодировка в строке, чтобы ускорить парсинг и обработку - я даже не думаю об этом.
+++
Главное, я не понимаю что делать. Как заставить работать trim?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Не могу избавится от пробела в строке

Сообщение Дож » 01.09.2016 19:35:39

Тесткейс с примером, на котором trim и utf8trim не отрезают пробелы, в студию.

pos ('#0', vrem_str)

Это ищет строку '#0' из двух символов (решётка и ноль). Нужно указать просто #0 без кавычек, чтобы был символ с кодом 0.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 01.09.2016 19:44:46

Поэтому я пытаюсь ее в ansi перегнать, чтобы быть уверенным, что кодировка мне известна теперь
вы уверены что перегнав непонятно что в анси решите проблему? Кажись вы их ещё больше получите. А потом ещё и в ютф8 переганять. Может такой бред получиться.
с сайтов очень часто распростроняют бинарные данные
сигнатура не поможет?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Не могу избавится от пробела в строке

Сообщение resident » 01.09.2016 20:19:07

Дож
+1
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 01.09.2016 20:20:05

по поводу
and (pos(chr(32), vrem_str)
вы с помощью анси функции ищете в ютф8 строке. Это, немного, интересно и странно...

Добавлено спустя 18 минут 59 секунд:
п.с.
Код: Выделить всё
if (utf8pos(' ', vrem_str) = 0)
- надеюсь тут пробел
с этим кодом вроде всё нормально.
Идём далее.
Пытаемся функцией анси узнать длину (с удаление пробелов) ютф8 строки.
Код: Выделить всё
and (length(utf8trim(vrem_str)) = 3)

и потом: пытаемся найти в ютф8 строке пробел используя анси функцию..
and (pos(chr(32), vrem_str) = 0) then begin

бредово как то... Вам не кажется???
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Не могу избавится от пробела в строке

Сообщение bormant » 01.09.2016 20:42:08

pupsik,
прочитайте внимательно про utf-8. Байт с кодом 32 может быть только одиночным символом и не может быть частью составного символа -- ни первым его байтом, ни средним, ни последним.
С учетом сказанного, в чем же странность поиска байта с кодом 32 в utf-8 строке при помощи ANSI функции?
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 01.09.2016 21:27:38

bormant а где уверенность что проблема только в пробеле? azsx сам написал что не знает какую строку получает (её кодировку). Но считает что она ютф8. Поэтому:
прочитайте внимательно про utf-8
как то не в тему...
Что будет если получить в 1252, а работать как с ютф8? Да ещё и преобразовывать её в анси, а потом обратно. Есть ли вероятность что в определенных ситуациях какой то символ будет не верно обработан и вырисуется что то странное?

С учетом сказанного, в чем же странность поиска байта с кодом 32 в utf-8 строке при помощи ANSI функции?
т.е. это касаемо всех кодировок? И пробел будет всегда 32? И как интерпретировать вики: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%B5%D0%BB? Там этих пробелов: "Греблю гати". И, если учесть, что текст (строка) берётся из разных источников. И эти источники, хм.., все "по ГОСТУ". Ну да: пробел будет всегда 32.

п.с.
Зачем тогда это разделение: utf8pos, utf16pos, pos? Запутать ещё больше и дальше? :D
И пока не будет:
Тесткейс с примером, на котором trim и utf8trim не отрезают пробелы, в студию.
толку никакого. Trim, как и его ютф аналог обрабатывает строку верно. Самому интересно взглянуть на "кривую" строку где трим сплоховал.

Добавлено спустя 5 минут 49 секунд:
ппц.:
Другие пробелы в Юникоде
16 штук :shock: Это что за хм... "весёлость"?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Не могу избавится от пробела в строке

Сообщение azsx » 02.09.2016 08:56:57

я совсем запутался. https://cloud.mail.ru/public/N8mL/pPSd8nkAy
В папке in я скопировал в тхт файлы сами данные. В папке out выходят шинглы. Вот когда я эти данные получаю из бд, прогоняю по своему алгоритму, а затем пишу в бд - у меня бывают шинглы с пробелами.
А вот в тестовой программе, хотя алгоритм просто скопирован из основной и только в in записал данные из ЮД - пробелов нет!!!
Просто даже не понимаю как такое может быть.
То есть при получении этих данных из бд на всех файлах сработало исключение на запись шингла с пробелом.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 02.09.2016 09:17:39

а с циклом я угадал :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Не могу избавится от пробела в строке

Сообщение azsx » 02.09.2016 10:05:24

а с циклом я угадал

вы бы сделали обработку без цикла? Как? зы увидел в почте.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Не могу избавится от пробела в строке

Сообщение pupsik » 02.09.2016 10:23:21

И кстати: там странность с кодом 20, а не 32...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

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

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

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

Рейтинг@Mail.ru