function isBinaryStream(string $stream) : bool {
// 1) Try to detect encoding
// $encoding is a prioritized list of encodings (from less widely used to most widely used) for many Western and East Asian applications
$encoding = mb_detect_encoding($stream, [
'UTF-8', 'GB18030', 'BIG-5', 'EUC-JP', 'SJIS', 'ASCII', 'Windows-1252', 'ISO-8859-1', 'Windows-1251', 'KOI8-R',
], true);
if ($encoding !== 'UTF-8') {
$stream = mb_convert_encoding($stream, 'UTF-8', $encoding);
}
// 2) Split into characters and convert to code points
$chars = mb_str_split($stream, 1, 'UTF-8');
if (! $chars) {
return true;
}
$ordValues = array_map('mb_ord', $chars);
// 3) Disallow control chars except \t(9), \n(10), \r(13) and disallow code points above 0x10FFFF (invalid Unicode)
foreach ($ordValues as $ord) {
if ($ord < 0x20 && ! in_array($ord, [9, 10, 13], true)) {
return true;
}
if ($ord > 0x10FFFF) {
return true;
}
}
// If we are here, we consider $stream textual
return false;
}
< /code>
попробовал это решение с помощью ctype_print, и это также дало мне много ложных срабатываний. < /p>
факт, что я намеренно работаю над Строки, которые не имеют никакого NUL
байт (по дизайну), и я чувствую, что моя реализация Isbinarystream отсутствует. Я не совсем уверен, что это будет работать только для текстовых потоков на незападных кодировках. Кроме того, я клянусь, что это может быть чрезвычайно оптимизировано. < /P>
Что вы предлагаете? Спасибо за совет.
А именно, как бы вы сообщили строку, которая содержит бинарные данные из text в строке, которая не имеет nul байты? Я пытаюсь реализовать: < /p> [list] [*] A [b] Полный PHP < /strong> Solution < /li> С Нет [/b] внешние библиотеки [*] кодирование-aware [*] Последовательный [*] и [b] быстро [/b] достаточно, чтобы справиться с длинными потоками [/list] Вот лучшее решение, которое я столкнулся (среди всех неработающих), которое полагается на MBString Семейство функций: [code]function isBinaryStream(string $stream) : bool { // 1) Try to detect encoding // $encoding is a prioritized list of encodings (from less widely used to most widely used) for many Western and East Asian applications $encoding = mb_detect_encoding($stream, [ 'UTF-8', 'GB18030', 'BIG-5', 'EUC-JP', 'SJIS', 'ASCII', 'Windows-1252', 'ISO-8859-1', 'Windows-1251', 'KOI8-R', ], true); if ($encoding !== 'UTF-8') { $stream = mb_convert_encoding($stream, 'UTF-8', $encoding); }
// 2) Split into characters and convert to code points $chars = mb_str_split($stream, 1, 'UTF-8'); if (! $chars) { return true; } $ordValues = array_map('mb_ord', $chars);
// 3) Disallow control chars except \t(9), \n(10), \r(13) and disallow code points above 0x10FFFF (invalid Unicode) foreach ($ordValues as $ord) { if ($ord < 0x20 && ! in_array($ord, [9, 10, 13], true)) { return true; } if ($ord > 0x10FFFF) { return true; } }
// If we are here, we consider $stream textual return false; } < /code> попробовал это решение с помощью ctype_print, и это также дало мне много ложных срабатываний. < /p> факт, что я намеренно работаю над Строки, которые не имеют никакого NUL [/code] байт (по дизайну), и я чувствую, что моя реализация Isbinarystream отсутствует. Я не совсем уверен, что это будет работать только для текстовых потоков на незападных кодировках. Кроме того, я клянусь, что это может быть чрезвычайно оптимизировано. < /P> Что вы предлагаете? Спасибо за совет.
У меня есть устройство, использующее модифицированный протокол Modbus. Устройство отправляет сообщения на последовательный порт RPi3. Сообщение имеет длину 14 байт и начинается с байта синхронизации, за которым следуют 11 байтов данных, а затем два...
введите здесь описание изображения
Изображение выше взято из Bing。
При переводе «微博» на корейский с помощью Microsoft интерфейс возвращает искаженный символ '웨이보(微��', потому что неизвестно, есть ли другие искаженные результаты перевода.
Могу ли я...