【问题标题】:Escape white space in boost::fs::path在 boost::fs::path 中转义空格
【发布时间】:2017-01-22 12:29:27
【问题描述】:

罐头上写着什么。有没有更聪明的方法来替换不需要regexboost::fs::path 中的空格?

编辑为例:

_appBundlePath = boost::fs::path("/path/with spaces/here");
regex space(" ");
string sampleFilename = regex_replace((_appBundlePath/"audio/samples/C.wav").string(), space, "\\ ");

问题:有没有办法避免使用正则表达式?对我来说似乎有点矫枉过正。

EDIT 2 我的问题是通过 libpd 将字符串传递给 Pure Data 时。 PD 会将空格解释为分隔符,因此我的字符串将被分割成多个符号。用双引号括起来是行不通的,我什至不确定转义空格会不会,但值得一试。

【问题讨论】:

  • X/Y problem 是当您询问有关所选解决方案路径而不是目标的问题时。在这种情况下,问题似乎是 X/.../Z,因为您询问了您认为希望避免的解决方案路径,但没有指定目标。
  • 有任何特定的 API 调用吗?
  • 不确定你的意思……
  • "EDIT 2 我的问题是在将字符串传递给 Pure Data via libpd"时。那是一个图书馆。您希望使用什么函数。因为它是决定需要/接受什么输入的函数。
  • 我明白了。鉴于我正在处理 C++ 包装器,这就是我正在调用的方法 (github.com/libpd/libpd/blob/master/cpp/PdBase.cpp#L237),它又调用此函数 (github.com/libpd/libpd/blob/master/libpd_wrapper/z_libpd.c#L331)。不过,老实说,我确实看不出这与我原来的问题有什么关系。

标签: c++ boost escaping whitespace boost-filesystem


【解决方案1】:

最聪明的办法就是不去做。

例如,使用execve 而不是system(这样您就可以在数组中传递参数,无需外壳转义)。参见例如How can I escape variables sent to the 'system' command in C++?

或者,如果你例如与数据库服务器对话,不要连接查询,而是将参数绑定到准备好的语句中。这再次排除了任何转义的需要。

避免转义可以避免一大堆安全问题(RCE、SQLi 等)


如果你必须,可能就这样做

 "'" + replace_all(path.string(), "'", "''") + "'"

这对于例如bash贝壳

对于其他任何事情,找出哪些字符需要转义并使用适合目标的现有库函数,例如

【讨论】:

  • 没关系,但我正在与 Pure Data 交谈,将字符串作为符号发送。 Pure Data 将空格作为分隔符,因此我的字符串被分解为多个符号。我不确定转义空间是否会起作用,但值得一试。
  • @Morpheu5 我听到了,但会纠正你:你不是在谈论纯数据。事实上,在您最后一次发表评论之前,您从未提及过这个词。语境很重要!如果您使用相关文档的链接更新问题(什么是纯数据?)我会看看我是否可以回答您的实际问题
  • 嘿,如果我可以通过查看文档找到解决方案,我就不会在这里问问题了。我编辑了这个问题,但正如您将看到的,PD 是一个相当晦涩的专业工具,我认为将其作为上下文提供根本没有帮助。事实上,在 PD 和基于文本的编程语言方面都非常了解的人并不多,所以我得到答案的机会将会非常渺茫,以至于在实践中,我会询问有关所选解决方案的问题可以说是最好的做法。无论如何,欢迎您尝试:)
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2018-04-02
  • 2019-01-31
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多