Swift: выполнение команды Bash с международными форматированными строками - PullRequest
1 голос
/ 14 октября 2019

У меня проблемы с выполнением команд из Applescript и теперь с Swift . Необходимо запустить команды с "/ bin / bash" и аргументами -c или -lc. Проблема в том, что команды из Испании могут содержать акценты. Различные акценты, такие как á, é, í ..etc, обрезают команду и заканчивают ошибками.

Пример команды, такой как:

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.

У кого-то есть другая идея?

С уважением и благодарностью

1 Ответ

0 голосов
/ 16 октября 2019

Наконец, решение:


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
Iникогда не перестану учиться у лучших. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...