пятница, 29 января 2010 г.

Служебные символы: \r\n и другие.

Новички очень часто встречаются с ситуацией, когда хотят сохранить какой-то файл, а он не сохраняется, т.е. просто не появляется на диске! У меня у самого были такие же проблемы, когда я только начинал своё знакомство с HiAsm. В то время я мало знал компьютер, программирование (если честно, я и сейчас разбираюсь лишь в KOL и Pascal, ну и javascript немного). И тем не менее проблему я свою решил.

Кажется, что уже перепробовано и перепроверено всё: и позиция указателя в stream, и режим открытия файла (Write), но не сохраняется файл и всё тут!

А виной всему бывают символы, которые используются при задании имени файла, но одновременно являются служебными и в программе преобразовываются в другие символы. Эти символы включают в себя обратынй слеш \ и стоящую после него цифру, например: \1. Но могут быть и некоторые буквы: \n, \r.

Проведём опыт. Поставим на рабочее поле HiAsm поле ввода Edit и напишем в его параметре Caption что-нибудь содержащее слеши.



Мы указали здесь путь к одной из папок Windows. В редакторе формы оно отлично отображается, в редакторе параметра Caption - тоже. Но попробуйте запустить эту программу. У вас получится вот что: C:\WINDOWS\system32f5. Откуда там "f" и куда подевались "\102"? А это как раз тот случай, когда произошла замена служебных символов на другой символ. Для того служебные символы и нужны.

Разберёмся, в чём же дело. Возможно, вы знаете, что в ANSI символ кодируется 1 байтом. 1 байт (8 бит) может иметь 256 вариантов представления, то есть если кодировать 1 байтом 1 символ, то можно закодировать 256 символов. Что с успехом и сделано. И каждый символ имеет свой порядковый номер в специальной таблице. Например, "f" имеет номер 102. Догадались?


Комбинация "\102" просто вызывает соответствующий символ из таблицы. Так происходит потому, что некотоые символы невозможно ввести в клавиатуры, например разрыв строки и перевод каретки. Табуляцию тоже не всегда можно ввести с клавиатуры. Между тем, часто она бывает нужна. Например, в таблицах. Помните, там нужно выбрать символ-разделитель, которым будут разделяться тексты ячеек в строке? Обычные символы использовать нежелательно, потому что они могут присутствовать в тексте ячейки. А вот ту же табуляцию практически всегда можно использовать как символ разделитель.

Табуляция задаётся сочетанием "\9".

Однако мы не решили главный вопрос: а как же всё-таки сохранить файл в папку, в имени которой есть служебные символы? Это просто. Нужно вместо одинарных использовать двойные слеши, например:



Все двойные слеши в программе заменятся одиночными, но двойные нам и не нужны. Мы выполнили задачу и заставили правильно отображаться строку.

P.S. Новые видеоуроки по HiAsm появились практически ко всем статьям за октябрь 2009 г.






Японские мотопомпы бензиновые от производителя Мацусака. Вам предлагается широкий выбор моделей высокого качества. С ними вы без труда решите проблему открачивания воды.

Если у вас кондитерское производство, то обратите внимание на кондитерское оборудование: охлаждающий шкаф, дробилка для ореха, машина глазировочная и другие незаменимые в производсте питания машины.

Хотите посетить Нью-Йорк? Посетите сначала сайт и узнате о Нью-Йорке больше. Посмотрите интересные места города и отзывы туристов.

3 комментария:

  1. Админ, спасибо огромное за статью!!! А можно ли сделать так, чтобы, например, обычные символы заменялись на служебные не в имени файла, а как в Microsoft Word? Я просто хочу как-нибудь сделать свой текстовый редактор наподобие Microsoft Word. Правда, там не будет столько возможностей, как в оригинальном Ворде, но автозамена и вставка специальных символов должна присутствовать.

    ОтветитьУдалить
  2. А как это они в MSWord заменяются на служебные? Чтобы вставить спецсимвол, можно в компоненте RichEdit нажать Alt и ввести номер символа. Однако MSWord на HiAsm вряд ли сделать. Слишком грандиозная цель.

    ОтветитьУдалить
  3. Я и не планировал MSWord в HiAsm делать, хотя бы похожий текстовый редактор типа Ворда, но функций уж точно будет поменьше. Есть там в Ворде функция для вставки спецсимволов, в HiAsm я также хочу сделать.

    ОтветитьУдалить