Строки Godot/gdscript с escape-символами из базы данных

Я создаю диалоговую систему в gdscript и борюсь с escape-символами, в частности «\ n».

Я использую CastleDB, так как, хотя он и не идеален, он позволил мне хранить почти все в данных и позволит человеку, который пишет для игры, делать все вне движка, без необходимости копировать и вставлять что-то внутрь.

Я наткнулся на камень преткновения с escape-символами. Одиночная текстовая запись в CastleDB не поддерживает пробелы, и '\n' внутри строки печатается как '\n', а не пробел, в диалоговом окне.

Я попытался использовать функцию строки формата с «некоторый текст здесь {пробел} еще немного текста», где пробел ссылается на строку, состоящую только из \n. Это по-прежнему печатает \n. Если я передам некоторую постоянную строку с \n посередине непосредственно в функцию, которая отображает текст диалога, она добавит пробел, поэтому я не совсем уверен, что здесь происходит.

У меня нет опыта работы с информатикой (я немного изучал C до указателей, после чего решил вернуться позже).

Что-то происходит в фоновом режиме с моей строкой в ​​gdscript? Он распечатывается так же, как вы ожидаете от строки, за исключением игнорирования моих escape-символов.

Может ли это быть как-то связано с тем, что он приходит в формате JSON? Насколько мне известно, даже если струну разрезать и собрать заново, она все равно должна вести себя как струна...?!

В любом случае, я не включил никакого кода, потому что не знаю, какой код вам нужно увидеть. Я надеюсь, что это что-то простое, потому что я учусь на ходу, я просто не знал об этом, но могу опубликовать код, если это поможет.

Спасибо,

Джеймс

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
1 336
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я решил эту проблему, посмотрев, как данные 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.

Другие вопросы по теме