- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试使用包含来自 Windows 环境变量的多字节字符的参数调用 exec,但尚未找到可行的解决方案。到目前为止,这是我能够调试的内容。
为简单起见,假设我有一个名为“Seán”的目录,我试图将其用作 exec 的参数。如果我只是打电话
exec 'script', "Se\u00E1n".encode("IBM437")
执行的脚本无法找到该文件,因为 arg 以丢失重音字符的方式进行了调整。如果我执行以下操作,它会起作用,但这是不好的做法,因为 arg 应该在进入 shell 之前进行转义。
exec "script #{"Se\u00E1n".encode("IBM437")}"
所以我的想法是我会使用 shellescape保护 exec 的使用。
require 'shellwords'
exec "script #{"Se\u00E1n".encode("IBM437").shellescape}"
但问题是它对特殊字符进行了转义,因此它看起来像下面这样 - "Se\án"。我弄清楚这是在哪里发生的,它来自这个 regular expression .
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")
乍一看似乎转义字符不在已知的良好 shell 字符集中。不幸的是,这个集合不包含特殊字符,所以我遇到了问题。
我正在寻找的是一个正则表达式,它可以进行 shell 转义,不会弄乱特殊字符,这样我就可以在将这些 args 传递给 exec 之前对其进行转义。
最佳答案
正则表达式 /([^A-Za-z0-9_\-.,:\/@\n])/
只处理 ASCII 字母和数字,而不是所有 Unicode 字母。 [^...]
是 negated character class匹配除类中指定的字符之外的所有字符。因此,所有 Я
、Ц
、Ą
都与该表达式一起删除,因为它们与 [A-Za-z] 不匹配
。
您需要添加速记类以排除所有 Unicode 字母和数字。为了让它更安全,我们可以添加一个变音符号类来保留变音符号:
str.gsub(/([^\p{L}\p{M}\p{N}_.,:\/@\n-])/, "\\\\\\1")
这里,\p{L}
匹配所有 Unicode 基本字母,\p{M}
匹配所有变音符号,\p{N}
code> 匹配任何 Unicode 数字。
请注意,当连字符位于字符类的开头/结尾(或在有效范围或速记字符类之后)时,不需要转义。
关于ruby - 如何使 ruby ShellWords.shellescape 使用多字节字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905127/
我一直在尝试使用包含来自 Windows 环境变量的多字节字符的参数调用 exec,但尚未找到可行的解决方案。到目前为止,这是我能够调试的内容。 为简单起见,假设我有一个名为“Seán”的目录,我试图
这个问题在这里已经有了答案: Is there an equivalent to the Ruby Shellwords module for the Windows shell? (3 个答案)
vim 命令让我感到困惑。我已经阅读并重新阅读了 :help shellescape() 几次。 shellescape(expand('%:p'), 1)中的数字1的含义我还是不太明白。 这是我想要
虽然 1.8.7 的构建我似乎有一个向后移植的 Shellwords::shellescape 版本,但我知道该方法是 1.9 的一个特性,在 1.8 的早期版本中绝对不支持.有谁知道我在哪里可以找到
我是一名优秀的程序员,十分优秀!