Ran*_*ggs 6 ruby regex windows escaping character-encoding
我一直试图用一个包含多字节字符的参数来调用exec,这些字符来自Windows上的环境变量,但还没有找到可行的解决方案.这是我迄今为止能够调试的内容.
为简单起见,假设我有一个名为"Seán"的目录,我试图将其用作exec的参数.如果我只是打电话
exec 'script', "Se\u00E1n".encode("IBM437")
Run Code Online (Sandbox Code Playgroud)
执行的脚本无法找到该文件,因为arg被调整以使重音字符丢失.如果我执行以下操作它可以工作,但这是不好的做法,因为arg应该在转到shell之前进行转义.
exec "script #{"Se\u00E1n".encode("IBM437")}"
Run Code Online (Sandbox Code Playgroud)
所以我的想法是我会使用shellescape来保护exec的使用.
require 'shellwords'
exec "script #{"Se\u00E1n".encode("IBM437").shellescape}"
Run Code Online (Sandbox Code Playgroud)
但问题是它逃脱了特殊角色,因此看起来如下 - "Se \án".我想出了这发生的地方,它来自这个正则表达式.
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")
Run Code Online (Sandbox Code Playgroud)
乍一看似乎是逃避字符而不是已知的一组shell字符.不幸的是,这套不包含特殊字符,所以我遇到了问题.
我正在寻找的是一个正则表达式,可以执行shell转义,不会弄乱特殊字符,这样我就可以在将它们传递给exec之前将其转义.
正则表达式/([^A-Za-z0-9_\\-.,:\\/@\\n])/仅处理 ASCII 字母和数字,而不是所有 Unicode 字母。是[^...]一个否定字符类,它匹配该类中指定的字符以外的所有字符。因此,所有\xd0\xaf, \xd0\xa6,\xc4\x84都会被该表达式删除,因为它们与[A-Za-z]。
您需要添加速记类来排除所有 Unicode 字母和数字。为了使其更加安全,我们可以添加一个变音符号类,以便也保留变音符号:
\n\nstr.gsub(/([^\\p{L}\\p{M}\\p{N}_.,:\\/@\\n-])/, "\\\\\\\\\\\\1")\nRun Code Online (Sandbox Code Playgroud)\n\n此处,\\p{L}匹配所有 Unicode 基本字母、\\p{M}匹配所有变音符号以及\\p{N}匹配任何 Unicode 数字。
请注意,当连字符位于字符类的开头/结尾(或在有效范围或速记字符类之后)时,不需要转义。
\n| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |