Я создаю диалоговую систему в gdscript и борюсь с escape-символами, в частности «\ n».
Я использую CastleDB, так как, хотя он и не идеален, он позволил мне хранить почти все в данных и позволит человеку, который пишет для игры, делать все вне движка, без необходимости копировать и вставлять что-то внутрь.
Я наткнулся на камень преткновения с escape-символами. Одиночная текстовая запись в CastleDB не поддерживает пробелы, и '\n' внутри строки печатается как '\n', а не пробел, в диалоговом окне.
Я попытался использовать функцию строки формата с «некоторый текст здесь {пробел} еще немного текста», где пробел ссылается на строку, состоящую только из \n. Это по-прежнему печатает \n. Если я передам некоторую постоянную строку с \n посередине непосредственно в функцию, которая отображает текст диалога, она добавит пробел, поэтому я не совсем уверен, что здесь происходит.
У меня нет опыта работы с информатикой (я немного изучал C до указателей, после чего решил вернуться позже).
Что-то происходит в фоновом режиме с моей строкой в gdscript? Он распечатывается так же, как вы ожидаете от строки, за исключением игнорирования моих escape-символов.
Может ли это быть как-то связано с тем, что он приходит в формате JSON? Насколько мне известно, даже если струну разрезать и собрать заново, она все равно должна вести себя как струна...?!
В любом случае, я не включил никакого кода, потому что не знаю, какой код вам нужно увидеть. Я надеюсь, что это что-то простое, потому что я учусь на ходу, я просто не знал об этом, но могу опубликовать код, если это поможет.
Спасибо,
Джеймс
Я решил эту проблему, посмотрев, как данные CastleDB хранятся на странице проекта github.
По какой-то причине "\n" сохранялось как "\\n" за кулисами. Теперь, когда я знаю, почему он печатался странно, я могу изменить его, хотя это кажется беспорядочным решением!
Чтобы добавить еще больше странности во все это дело с обратной косой чертой, переполнение стека отображает двойную обратную косую черту как одиночную обратную косую черту, поэтому мне нужно написать \\\n минус пробелы, чтобы получить \\n...
Я уверен, что должна быть причина, но она ускользает от меня.
Escape-последовательности — это способ обойти проблемы с синтаксисом. Когда вы вводите строку в большинстве языков программирования, она начинается с "
и заканчивается другим "
. И он должен оставаться на одной линии. Просто, верно?
Что, если вы хотите поместить настоящий "
в свою строку? Или новая линия? Нам нужен какой-то способ сказать компилятору: «Эй, мы хотим вставить здесь новую строку, даже если мы не можем использовать фактический символ новой строки». Поэтому мы используем \
, чтобы сообщить компилятору, что следующий символ является частью управляющей последовательности.
Это вызывает другую проблему: что, если мы буквально хотим поместить обратную косую черту в строку? Вот откуда взялась двойная обратная косая черта: \\
— это управляющая последовательность для \
, поскольку \
сама по себе имеет особое значение.
Но CastleDB (видимо, я с ней не знаком) не распознает escape-последовательности, поэтому, когда вы вводите \n
, она думает, что вы буквально хотите \
, за которой следует n
. Когда он преобразует это в JSON, он вставляет \\
, потому что JSON распознает escape-последовательности.
GDScript также распознает escape-последовательности, поэтому print("Hello\nworld!")
печатает
Hello
world!
Вы можете попробовать input_string.replace("\\n", "\n")
заменить escape-последовательности \n
.