Непечатаемые символы (как различить?)

Модератор: Модераторы разделов

Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Непечатаемые символы

Сообщение /dev/random »

devilr писал:
26.01.2023 14:07
Если я видел "кракозябры" - это меня вполне устраивало (я просто переключу кодировку в программе, запрошу данные вновь и прочитаю).
А вы правда видели кракозябры? При попытке воспринять cp1251 как utf8, обычно вылезают квадратики, а не кракозябры.

Shell

$ echo привет | iconv -t cp1251
������
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Непечатаемые символы

Сообщение olecya »

devilr писал:
26.01.2023 14:07
запрошу данные вновь и прочитаю). Другое дело, что символ 0x00 или 0xFF отобразятся "квадратиками". А мне нужен либо текст, либо HEX.
Зачем переключать? Не пробовали читать лог с помощью команды less?
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

/dev/random писал:
26.01.2023 14:21
А вы правда видели кракозябры?
Видел. Допустим, есть 2 девайса, в одном из которых KOI8-R. в другом KOI8-U. Там "кракозябры" увидеть можно запросто. :)
И с ними я разберусь. Мне гораздо важнее различить текстовые и двоичные данные.
Добавлено (14:28):
olecya писала:
26.01.2023 14:22
Зачем переключать? Не пробовали читать лог с помощью команды less?
А зачем мне его читать? Оператору его глазами надо видеть. В приложении. И смочь прочитать по телефону. "Кракозябры" он точно не прочитает.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Непечатаемые символы

Сообщение olecya »

devilr писал:
26.01.2023 14:26
В приложении. И смочь прочитать по телефону. "Кракозябры" он точно не прочитает.
Ну если в приложении. А так less не выводит кракозябры хоть из бинаря хоть другая кодировка
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
26.01.2023 14:26
Допустим, есть 2 девайса, в одном из которых KOI8-R. в другом KOI8-U.
Слушайте, не морочьте себе и остальным головы. Сделайте параллельный вывод в шестнадцатеричном и текстовом виде, как в hexdump -C. А там уж оператор разберётся, куда глядеть.
Если на входе неизвестная кодировка, задача в поставленном виде нерешаема. Можно заюзать enca, конечно, но я не знаю, как она себя будет вести, когда на входе полная белиберда (двоичные данные).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Bizdelnick писал:
26.01.2023 17:42
А там уж оператор разберётся, куда глядеть.
Он и сейчас разбирается - просто выбирая чекбоксом TEXT или HEX. Но, хотелось бы автоматики.
Bizdelnick писал:
26.01.2023 17:42
Если на входе неизвестная кодировка, задача в поставленном виде нерешаема.
Задача не в определении кодировки, а в отличии бинарных данных от текстовых.

Как по мне - задача интересная. И вполне прикладная. Думал, может кто что знает. Или сталкивался.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
math
Сообщения: 276
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Непечатаемые символы

Сообщение math »

ormorph писал(а):
26.01.2023 13:33
Что то тут не так, это числа до трёх байт.
Всё так. Да для записи достаточно трёх байт. Так что в кодировке UTF-32 каждый четвёртый байт — гарантированно нулевой. Поэтому она и не в ходу, что слишком уж нерациональная. Средняя длина символа в других кодировках тоже будет примерно равна трём, но это средняя, от неё есть отклонения в обе стороны, поэтому в UTF-16 длина равна 2 или 4, а в UTF-8 от 1 до 4 байт.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
26.01.2023 19:35
Задача не в определении кодировки, а в отличии бинарных данных от текстовых.
Не просто от текстовых, а от текстовых в неизвестной кодировке. Это две большие разницы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Непечатаемые символы

Сообщение ormorph »

devilr
По вашему описанию задачи, можно прийти к выводу, что это не реальная задача. Так как у вас просто идёт поток байтов, и если эта информация не поделена на блоки, то определить это не реально, так как у вас по одному каналу может идти текст в разных кодировках и вы не знаете его длины. Тогда в отдельную выборку у вас может попасть текст в разных кодировках, как результат мы имеем фарш а не информацию.
Вы же понимаете, что текст на экране(терминале), это просто поток байтов идущий в stdout, а терминал просто обрабатывает его в соответствии с кодировкой, которая прописана в переменных среды и в соответствии с кодом(выборкой) выводится отдельный символ. Просто в зависимости от кодировки, даже текстовая информация в одной кодировке, может определяться как не текстовая в другой, так как по разному проходит выборка кодов.
Это я к чему, если я обычный бинарник отправлю в stdout с помощью cat, то тоже на экране будет целая куча символов, но это же не текстовый файл...
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

ormorph я всё понимаю. И сложность задачи понимаю. Мне, как говорила моя бабушка: "не шешнадцать лет" :D
Просто была надежда, что у кого то будет свежая идея. Решение этой проблемы. Но, нет - так нет. Значит, пока обойдусь чекбоксом.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Непечатаемые символы

Сообщение ormorph »

AT - команды не от хорошей жизни придумали. Просто была такая необходимость.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

ormorph писал(а):
26.01.2023 22:34
AT - команды не от хорошей жизни придумали. Просто была такая необходимость.
Раньше и машины слабее были.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

Можете попробовать извратиться таким образом: https://github.com/Perl/perl5/blob/b864a746559843cd8bc1720eaf14c83faeb8fcc7/cpan/Compress-Raw-Zlib/zlib-src/trees.c#L1092-L1132
Но с UTF-16 и UTF-32 точно не прокатит. (Надеюсь, хотя бы EBCDIC детектить не надо?)
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Непечатаемые символы

Сообщение ormorph »

devilr писал:
26.01.2023 22:43
Раньше и машины слабее были.
Можно сказать, что это что то меняет. Если канал один, то по нему нужно как то передавать пакеты, а следовательно что то должно быть началом пакета а что то концом, иначе весь смысл информации теряется.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

ormorph писал(а):
26.01.2023 22:58
Если канал один, то по нему нужно как то передавать пакеты, а следовательно что то должно быть началом пакета а что то концом, иначе весь смысл информации теряется.
В моём случае, я знаю что за пакет придёт. Потому как с другой стороны подсоединён вполне конкретный прибор. Просто, с одной стороны, довольно утомительно каждый раз расставлять чекбоксы. С другой стороны, если ошибся с переключателем - можно получить на экране мусор и не понять часть данных. Автоматизация решала бы эту проблему.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
26.01.2023 23:14
довольно утомительно каждый раз расставлять чекбоксы
Бодрейт, контроль чётности и прочее тоже утомительно. Переводите аппаратуру на USB или Bluetooth, и проблем не будет. ☺
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Bizdelnick писал:
27.01.2023 00:01
Бодрейт, контроль чётности и прочее тоже утомительно. Переводите аппаратуру на USB или Bluetooth, и проблем не будет.
Принципиально ничего не изменится. Отечественная измерительная техника - это RS-232 на выходе. Даже, если это USB.
P.S. Если бы идентификаторы хотя бы были - было бы легче. Но, у нас такое делать - западло. Шоб враг не догадался, видимо. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Непечатаемые символы

Сообщение ormorph »

devilr писал:
26.01.2023 23:14
В моём случае, я знаю что за пакет придёт.
Ага ещё бы компьютер тоже знал, то было бы совсем хорошо.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
27.01.2023 00:10
Принципиально ничего не изменится.
devilr писал:
27.01.2023 00:10
Если бы идентификаторы хотя бы были
Ну как бы USB и Bluetooth подразумевают идентификаторы.
Но ладно. Код, на который я давал ссылку выше, смотрели? Устроит, нет?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Bizdelnick писал:
27.01.2023 14:13
Ну как бы USB и Bluetooth подразумевают идентификаторы.
Подразумевают. В тех приборах, о которых я говорил, наружу будет светиться RS-232. Даже, если это будет выглядеть, как USB.
Bizdelnick писал:
27.01.2023 14:13
Но ладно. Код, на который я давал ссылку выше, смотрели? Устроит, нет?
Я пока его логики не понял. А просто так, скопировать-вставить ведь не выйдет. Из-за всяких deflate_state и прочего.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
27.01.2023 14:22
Я пока его логики не понял.
Так в комментарии, вроде, подробно описано. Сам код, конечно, напрямую неприменим (там заранее подсчитано число вхождений разных символов).
TEXT if the two conditions below are satisfied:
  1. There are no non-portable control characters belonging to the "block list" (0..6, 14..25, 28..31).
  2. There is at least one printable character belonging to the "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
BINARY otherwise.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Если это просто поиск в таблице "запрещённых" и "разрешенных" однобайтовых символов - то не пойдёт сразу.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
27.01.2023 15:56
Если это просто поиск в таблице "запрещённых" и "разрешенных" однобайтовых символов - то не пойдёт сразу.
Почему? И, собственно, какие тут ещё могут быть варианты?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Bizdelnick писал:
27.01.2023 16:00
Почему? И, собственно, какие тут ещё могут быть варианты?
Потому как, тот же QString("hello.") и QString("привет") отнесутся, скорее всего к TEXT для первой строки и BINARY ко второй. Во втором случае символов в 2 раза больше, если приводить к QByteArray. И нулевые символы всё испортят. Тут либо делать 100500 проверок для символа из 1 и 2 байт, либо плюнуть и остаться с чекбоксом.
Как сейчас и сделано, собственно.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Непечатаемые символы

Сообщение /dev/random »

devilr писал:
27.01.2023 16:12
если приводить к QByteArray
Эээ, что? Приводить к QByteArray? Разве вы не массив байтов получаете от устройства? Вот и оставляйте его массивом байтов. Не приводите к QString, пока не будете уверены, что это текст, а не двоичные данные. И проверяйте наличие байтов \x01-\x08, \x0B, \x0C, \x0E-\x1F, \x7F. Не зная заранее кодировки, больше ничего сделать нельзя.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

/dev/random писал:
27.01.2023 16:19
Не приводите к QString, пока не будете уверены, что это текст, а не двоичные данные.
Если бы я был уверен - этой темы бы не было.
Мне нужно было различить. Я нашёл некий пример в интернете. Проверил его. Как раз приведя массив к строке. Не получилось. Спросил здесь. Похоже, здесь тоже никто ничего оригинального предложить не может. Остался пока на чекбоксе, но надежды найти решение не теряю.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Непечатаемые символы

Сообщение /dev/random »

devilr писал:
27.01.2023 16:30
Если бы я был уверен - этой темы бы не было.
Вы не поняли. Я имел в виду, что вам нужно _сначала_ проверить, есть ли там "плохие" байты, и только если их нет, создавать QString. А не как вы изначально сделали, сначала создаёте QString, а потом пытаетесь регуляркой посмотреть, что там Qt нагородил при конвертации.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
27.01.2023 16:12
Потому как, тот же QString("hello.") и QString("привет") отнесутся, скорее всего к TEXT для первой строки и BINARY ко второй. Во втором случае символов в 2 раза больше, если приводить к QByteArray.
То есть Вы боитесь за неверную интерпретацию UTF-8? Напрасно. Все байты многобайтовых последовательностей UTF-8 имеют старший бит 1 и, соответственно, попадают в список допустимых в тексте.
devilr писал:
27.01.2023 16:30
Я нашёл некий пример в интернете. Проверил его. Как раз приведя массив к строке.
Ну так он потому и не сработал, что Вы привели массив к строке, когда этого делать нельзя. QRegularExpression работает только с UTF-16, а у Вас входная кодировка априори неизвестна.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Непечатаемые символы

Сообщение devilr »

Bizdelnick писал:
27.01.2023 16:40
Ну так он потому и не сработал, что Вы привели массив к строке, когда этого делать нельзя. QRegularExpression работает только с UTF-16, а у Вас входная кодировка априори неизвестна.
Я в курсе, что он не сработал. Потому и создал тему.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непечатаемые символы

Сообщение Bizdelnick »

devilr писал:
27.01.2023 16:43
Я в курсе, что он не сработал.
Пожалуйста, перечитайте сообщение, на которое ответили. Его смысл не в том, что регулярка не сработала, а в том, почему она не сработала.
Добавлено (16:56):
Offtopic
devilr писал:
27.01.2023 16:12
Потому как, тот же QString("hello.") и QString("привет") отнесутся, скорее всего к TEXT для первой строки и BINARY ко второй. Во втором случае символов в 2 раза больше, если приводить к QByteArray.
Вообще, насколько я разумею, байтов в обеих строках будет равное количество, потому что конструктор QString выполнит преобразование из UTF-8 в UTF-16, а при приведении к QByteArray размер строк никак не изменится. Можете проверить на досуге.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить