А вы правда видели кракозябры? При попытке воспринять cp1251 как utf8, обычно вылезают квадратики, а не кракозябры.
Shell
$ echo привет | iconv -t cp1251
������
Модератор: Модераторы разделов
А вы правда видели кракозябры? При попытке воспринять cp1251 как utf8, обычно вылезают квадратики, а не кракозябры.
Shell
$ echo привет | iconv -t cp1251
������
Видел. Допустим, есть 2 девайса, в одном из которых KOI8-R. в другом KOI8-U. Там "кракозябры" увидеть можно запросто.
А зачем мне его читать? Оператору его глазами надо видеть. В приложении. И смочь прочитать по телефону. "Кракозябры" он точно не прочитает.
Слушайте, не морочьте себе и остальным головы. Сделайте параллельный вывод в шестнадцатеричном и текстовом виде, как в hexdump -C. А там уж оператор разберётся, куда глядеть.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Он и сейчас разбирается - просто выбирая чекбоксом TEXT или HEX. Но, хотелось бы автоматики.
Задача не в определении кодировки, а в отличии бинарных данных от текстовых.Bizdelnick писал: ↑26.01.2023 17:42Если на входе неизвестная кодировка, задача в поставленном виде нерешаема.
Всё так. Да для записи достаточно трёх байт. Так что в кодировке UTF-32 каждый четвёртый байт — гарантированно нулевой. Поэтому она и не в ходу, что слишком уж нерациональная. Средняя длина символа в других кодировках тоже будет примерно равна трём, но это средняя, от неё есть отклонения в обе стороны, поэтому в UTF-16 длина равна 2 или 4, а в UTF-8 от 1 до 4 байт.
Не просто от текстовых, а от текстовых в неизвестной кодировке. Это две большие разницы.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Раньше и машины слабее были.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
В моём случае, я знаю что за пакет придёт. Потому как с другой стороны подсоединён вполне конкретный прибор. Просто, с одной стороны, довольно утомительно каждый раз расставлять чекбоксы. С другой стороны, если ошибся с переключателем - можно получить на экране мусор и не понять часть данных. Автоматизация решала бы эту проблему.
Бодрейт, контроль чётности и прочее тоже утомительно. Переводите аппаратуру на USB или Bluetooth, и проблем не будет. ☺
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Принципиально ничего не изменится. Отечественная измерительная техника - это RS-232 на выходе. Даже, если это USB.Bizdelnick писал: ↑27.01.2023 00:01Бодрейт, контроль чётности и прочее тоже утомительно. Переводите аппаратуру на USB или Bluetooth, и проблем не будет.
Ну как бы USB и Bluetooth подразумевают идентификаторы.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Подразумевают. В тех приборах, о которых я говорил, наружу будет светиться RS-232. Даже, если это будет выглядеть, как USB.
Я пока его логики не понял. А просто так, скопировать-вставить ведь не выйдет. Из-за всяких deflate_state и прочего.Bizdelnick писал: ↑27.01.2023 14:13Но ладно. Код, на который я давал ссылку выше, смотрели? Устроит, нет?
Так в комментарии, вроде, подробно описано. Сам код, конечно, напрямую неприменим (там заранее подсчитано число вхождений разных символов).
TEXT if the two conditions below are satisfied:BINARY otherwise.
- There are no non-portable control characters belonging to the "block list" (0..6, 14..25, 28..31).
- There is at least one printable character belonging to the "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Почему? И, собственно, какие тут ещё могут быть варианты?
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Потому как, тот же QString("hello.") и QString("привет") отнесутся, скорее всего к TEXT для первой строки и BINARY ко второй. Во втором случае символов в 2 раза больше, если приводить к QByteArray. И нулевые символы всё испортят. Тут либо делать 100500 проверок для символа из 1 и 2 байт, либо плюнуть и остаться с чекбоксом.
Эээ, что? Приводить к QByteArray? Разве вы не массив байтов получаете от устройства? Вот и оставляйте его массивом байтов. Не приводите к QString, пока не будете уверены, что это текст, а не двоичные данные. И проверяйте наличие байтов \x01-\x08, \x0B, \x0C, \x0E-\x1F, \x7F. Не зная заранее кодировки, больше ничего сделать нельзя.
Если бы я был уверен - этой темы бы не было./dev/random писал: ↑27.01.2023 16:19Не приводите к QString, пока не будете уверены, что это текст, а не двоичные данные.
Вы не поняли. Я имел в виду, что вам нужно _сначала_ проверить, есть ли там "плохие" байты, и только если их нет, создавать QString. А не как вы изначально сделали, сначала создаёте QString, а потом пытаетесь регуляркой посмотреть, что там Qt нагородил при конвертации.
То есть Вы боитесь за неверную интерпретацию UTF-8? Напрасно. Все байты многобайтовых последовательностей UTF-8 имеют старший бит 1 и, соответственно, попадают в список допустимых в тексте.
Ну так он потому и не сработал, что Вы привели массив к строке, когда этого делать нельзя. QRegularExpression работает только с UTF-16, а у Вас входная кодировка априори неизвестна.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Я в курсе, что он не сработал. Потому и создал тему.Bizdelnick писал: ↑27.01.2023 16:40Ну так он потому и не сработал, что Вы привели массив к строке, когда этого делать нельзя. QRegularExpression работает только с UTF-16, а у Вас входная кодировка априори неизвестна.
Пожалуйста, перечитайте сообщение, на которое ответили. Его смысл не в том, что регулярка не сработала, а в том, почему она не сработала.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |