Какой самый простой алгоритм экранирования одного символа?

Я пытаюсь написать две функции escape(текст, разделитель)и unescape(текст, разделитель)со следующими свойствами:

  1. Результат escapeне содержит разделитель.

  2. unescapeявляется обратным escape, то есть

    unescape(escape(текст, разделитель), разделитель) == текст
    

    для всех значений тексти разделитель

Можно ограничить допустимые значения разделитель.


Фон: я хочу создать строку значений, разделенных разделителями. Чтобы иметь возможность снова извлечь тот же список из строки, я должен убедиться, что отдельные разделенные строки не содержат разделителя.


Что я пробовал: я придумал простое решение (псевдокод):

escape(text, delimiter):   return text.Replace("\", "\\").Replace(delimiter, "\d")
unescape(text, delimiter): return text.Replace("\d", delimiter).Replace("\\", "\")

, но обнаружил, что свойство 2 не работает в тестовой строке "\d". В настоящее время у меня есть следующее рабочее решение

escape(text, delimiter):   return text.Replace("\", "\b").Replace(delimiter, "\d")
unescape(text, delimiter): return text.Replace("\d", delimiter).Replace("\b", "\")

, которое, похоже, работает, если delimiterне равно \, bили d(это нормально, я все равно не хочу использовать их в качестве разделителей). Однако, поскольку формально я не доказал его правильность, боюсь, что упустил какой-то случай, когда одно из свойств нарушается. Поскольку это такая распространенная проблема, я предполагаю, что для этого уже существует «хорошо известный проверенный правильный» алгоритм, отсюда и мой вопрос (см. заголовок).

9
задан Heinzi 14 June 2012 в 13:14
поделиться