Заменяем табуляции на пробелы без изменения внешнего вида текста
Символ табуляции может заменить несколько подряд идущих пробелов и позволяет удобно выравнивать столбцы в текстовом документе, но он же способен создать серьёзные проблемы, если мы откроем текст в редакторе с другим отступом табуляции.
Самое безопасное - не использовать табуляцию вообще, тогда и Excel, например, сумеет открыть текстовый файл в формате "с фиксированной шириной столбцов", а иначе несколько подряд идущих табуляций, да ещё и перемешанных с пробелами, собьют его с толку.
Прилагаемый ниже маленький сервис на PHP сегодня помог мне решить проблему замены табуляций пробелами.
Предполагается, что основной исходный файл сервиса index.php
будет сохранён в кодировке Юникода utf-8 и загружаемые текстовые файлы будут закодированы в ней же.
Так как сервис загружает файл на сервер, прикладываю только исходник без онлайна, проверял в Denwer, больше ничего не было под рукой.
В папке с файлом index.php
также расположен файл .htaccess со следующим содержимым:
AddDefaultCharset utf-8 php_value display_errors 1
Для загрузки файлов в папке со скриптом создана вложенная папка с именем upload
. Обработанный текстовый файл удаляется из неё, а результат работы выводится в многострочное текстовое поле <textarea>
. Оттуда его уже можно вырезать комбинациями клавиш Ctrl+A, Ctrl+C, чтобы затем вставить в нужный текстовый редактор с помощью Ctrl+V.
Следите, чтобы ваш текстовый редактор, куда вы будете вставлять текст из поля результата, не делал автоматическую замену пробелов табуляциями. Например, Notepad++ перестаёт баловаться с автозаменой табуляциями, если заранее отключить соответствующую опцию: меню Опции - Настройки - Синтаксисы - Настройка табуляции, включить флажок "Заменять пробелом".
Ну и, наконец, сам исходник.
<!DOCTYPE html> <html lang="ru"> <head> <title>Detab</title> <meta charset="utf-8"> </head><body> <?php if (isset($_POST['submit'])) { $error = ''; if ($_FILES['filename']['size'] > 1*1024*1024) { $error = 'Файл больше 1 Мб!'; } if (is_uploaded_file($_FILES['filename']['tmp_name'])) { $newname = './upload/'.basename($_FILES['filename']['name']); move_uploaded_file($_FILES['filename']['tmp_name'], $newname); $error = 'Файл загружен'; $arr = file ($newname); $n = count ($arr); $res = ''; $tsize = 8; if (isset($_POST['tsize'])) $tsize = intval($_POST['tsize']); if ($tsize < 1 or $tsize > 16) $tsize = 8; mb_internal_encoding("UTF-8"); for ($i = 0; $i < $n; $i++) { $str = $arr [$i]; $len = mb_strlen ($str,'UTF-8'); $newstr = ''; for ($k = 0; $k < $len; $k++) { $c = mb_substr($str,$k,1,'UTF-8'); if (ord($c) == 9) { $tabs = mb_strlen ($newstr,'UTF-8'); for ($j = 0; $j < $tsize - $tabs % $tsize; $j++) $newstr .= ' '; } else $newstr .= $c; } $res .= $newstr; } echo '<textarea rows="16" cols="90">'.$res.'</textarea>'; @unlink ($newname); } else { $error = 'Ошибка загрузки файла!'; } echo '<p>'.$error.'. <a href="index.php">Назад</a></p>'; } else { echo '<form method="post" enctype="multipart/form-data">'."\n". 'Имя файла: <input type="file" name="filename">'."\n". 'Размер табуляции (от 1 до 16): <input type="number" name="tsize" min="1" max="16" value="8" required>'."\n". ' <input type="submit" name="submit" value="Загрузить">'."\n". '</form>'; } ?> </body> </html>
загрузка файла в сервис
результат работы сервиса (в Far открыт исходный файл, в браузере - преобразованный текст)
02.11.2019, 17:06 [2666 просмотров]