Godot/gdscript 个带有数据库转义字符的字符串

Godot/gdscript strings with escape characters from database

我正在用 gdscript 制作一个对话系统,并且正在努力处理转义字符,特别是 '\n'。

我正在使用 CastleDB,虽然它并不完美,但它允许我将几乎所有内容都存储在数据中,并且允许编写游戏的人在引擎之外做所有事情,而无需我复制并粘贴内容。

我遇到了转义字符的绊脚石。 CastleDB 中的单个文本条目不支持 spaces,字符串中的 '\n' 在对话框中打印为 '\n',而不是 space。

我试过将格式字符串函数与 'some text here {space} some more text' 一起使用,其中 space 引用仅包含 \n 的字符串。这仍然打印 \n。如果我将中间带有 \n 的常量字符串直接输入到显示对话框文本的函数中,它会添加一个 space 所以我不太确定这里发生了什么。

我没有计算机科学背景(我已经学过一些 C 语言直到得到指针,那时我决定 return 稍后)。

我在 gdscript 中的字符串是否在后台发生了什么?除了忽略我的转义字符外,它的打印结果就像您期望的字符串一样。

这可能与它以 JSON 形式出现有关吗?据我所知,即使一个字符串被切碎并重新组合,它仍然应该表现得像一个字符串...?!

无论如何,我没有包含任何代码,因为我不知道您需要查看什么代码。我希望这很简单,因为我边走边自学,我只是不知道,但如果有帮助,我可以 post 编码。

谢谢,

詹姆斯

我通过查看 CastleDB 数据在项目 github 页面上的存储方式解决了这个问题。

出于某种原因,“\n”在幕后被存储为“\\n”。既然我知道为什么它会打印得很奇怪,我就可以更改它,即使它感觉像是一个混乱的解决方案!

为了给整个反斜杠业务添加更多的怪异,堆栈溢出将双反斜杠显示为单个反斜杠,所以我必须写 \ \ \n 减去空格得到 \\n...

我敢肯定一定有原因,但我想不通。

转义序列是一种解决语法问题的方法。当您在大多数编程语言中键入字符串时,它以 " 开头并以另一个 " 结尾。它需要保持在一条线上。简单吧?

如果您想在字符串中放入实际的 " 怎么办?还是一条新线路?我们需要某种方式告诉编译器,“嘿,我们想在这里插入一个换行符,即使我们不能使用实际的换行符”。所以我们使用 \ 让编译器知道下一个字符是 转义序列 .

的一部分

这会导致另一个问题:如果我们真的想在字符串中加入反斜杠怎么办?这就是双反斜杠的来源:\\ 的转义序列,因为 \ 本身具有特殊含义。

但是 CastleDB(显然,我不熟悉它)不识别转义序列,所以当您键入 \n 它认为您确实想要 \ 后跟 n.当它将其转换为 JSON 时,它会插入 \ 因为 JSON 确实 识别转义序列。

GDScript 也能识别转义序列,所以print("Hello\nworld!") 打印

Hello
world!

您可以尝试 input_string.replace("\n", "\n") 替换 \n 转义序列。