Swift:使用国际格式的字符串执行 Bash 命令

Swift: Execute Bash command with international formatted Strings

我在 ApplescriptSwift 中执行命令时遇到问题。 必须使用“/bin/bash”和参数 -c 或 -lc 启动命令。问题是来自西班牙,命令可能包含重音。 á、é、í ..等不同的重音会截断命令并以错误结束。

示例命令如:

mkvmerge -i Poesía bonita.mkv

将发布为:

mkvmerge -i Poesi

尝试使用单引号和双引号但没有用。

mkvmerge -i "Poesía bonita.mkv"
mkvmerge -i 'Poesía bonita.mkv'

是否有从 Swift 启动命令的正确方法?

我使用:

let command = "mkvmerge - i '/Users/Poesía bonita.mkv'"

let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-lc", command]        
let pipe = Pipe()
task.standardOutput = pipe
task.launch()

刚刚尝试使用@RobC 解决方案使用此功能转义特殊字符:

func repairString(theString: String) -> String{

    let accentedChars = ["á","Á","ä","Ä","é","É","í","Í","ó","Ó","ö","Ö","ú","Ú","ü","Ü","ñ","Ñ"]

    var theNewString = ""
    for char in accentedChars{
        if theString.contains(String(char)) {
            theNewString = theString.replacingOccurrences(of: String(char), with: "\" + String(char))
        }
    }

    return theNewString
}

但不起作用

Error: The file '/Users/Poes\i' could not be opened for reading: open file error.

有人有其他想法吗?

问候和感谢

终于有解决办法了:


let launchPath = "/usr/local/bin/python"
let arguments = [PyPath.path, correctPath.path]

print(shell(launchPath, arguments))


func shell(_ launchPath: String,_ arguments: [String]) -> String {

    let task = Process()
    task.environment = ["LANG" : "es_ES.UTF-8"]
    task.launchPath = launchPath
    task.arguments = arguments
    task.waitUntilExit()

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String

    return output
}

诀窍是将环境变量 "LANG" 设置为正确的。 似乎 Process() 将其 env 设置为创建任务的默认值。

在 Applescript 中同样如此。

感谢@RobC 和@foo
我永远不会停止向最好的人学习。 ;)