Swift:使用国际格式的字符串执行 Bash 命令
Swift: Execute Bash command with international formatted Strings
我在 Applescript 和 Swift 中执行命令时遇到问题。
必须使用“/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
我永远不会停止向最好的人学习。 ;)
我在 Applescript 和 Swift 中执行命令时遇到问题。
必须使用“/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
我永远不会停止向最好的人学习。 ;)