Как разбить некодированную строку на символы - PullRequest
0 голосов
/ 28 марта 2020

У меня есть строки вроде

"\U0aac\U0ab9\U0ac1\U0ab5\U0a9a\U0aa8",
"\U0a97\U0ac1\U0ab8\U0acd\U0ab8\U0acb",
"\U0aa6\U0abe\U0ab5\U0acb",
"\U0a96\U0a82\U0aa1"

Но я хочу разбить эти строки на символы Юникода

Я не знаю, что делать. Я знаю компоненты, разделенные по функциям, но здесь это бесполезно. \ nКакая помощь будет оценена

Ответы [ 3 ]

0 голосов
/ 28 марта 2020

Если строки, которые вы получаете, действительно содержат \U символов, вам нужно проанализировать их вручную и извлечь скалярные значения Unicode. Как то так:

let strings = [
    "\\U0aac\\U0ab9\\U0ac1\\U0ab5\\U0a9a\\U0aa8",
    "\\U0a97\\U0ac1\\U0ab8\\U0acd\\U0ab8\\U0acb",
    "\\U0aa6\\U0abe\\U0ab5\\U0acb",
    "\\U0a96\\U0a82\\U0aa1"
]

for str in strings {
    let chars = str.components(separatedBy: "\\U")
    var string = ""
    for ch in chars {
        if let val = Int(ch, radix: 16), let uni = Unicode.Scalar(val) {
            string.unicodeScalars.append(uni)
        }
    }
    print(string)
}

0 голосов
/ 28 марта 2020

Вы можете отобразить свой массив, разбить его элементы на значения, отличные от шестнадцатеричных git, сжать их в значения UInt32, инициализировать с ними скаляры Юникода и отобразить результирующие элементы вашего массива в UnicodeScalarView и инициировать новую строку с it:

let arr = [
    #"\U0aac\U0ab9\U0ac1\U0ab5\U0a9a\U0aa8"#,
    #"\U0a97\U0ac1\U0ab8\U0acd\U0ab8\U0acb"#,
    #"\U0aa6\U0abe\U0ab5\U0acb"#,
    #"\U0a96\U0a82\U0aa1"#]

let strings = arr.map {
    $0.split { !$0.isHexDigit }
    .compactMap { UInt32($0, radix: 16) }
    .compactMap(Unicode.Scalar.init)
}.map { String(String.UnicodeScalarView($0)) }

print(strings)

Будет напечатано

["બહુવચન", "ગુસ્સો", "દાવો", "ખંડ"]

0 голосов
/ 28 марта 2020

Итак, возвращаемая строка уже имеет "\", потому что для использования компонентов вам понадобится дополнительный экранирующий символ "\", чтобы вы могли сделать:

var listofCodes = ["\\U0aac\\U0ab9\\U0ac1\\U0ab5\\U0a9a\\U0aa8", "\\U0aac\\U0ab9\\U0ac1\\U0ab5\\U0a9a\\U0aa8"]

var unicodeArray :[String] = []
listofCodes.forEach { string in

    unicodeArray
        .append(contentsOf: string.components(separatedBy: "\\"))
    unicodeArray.removeAll(where: {value in  value == ""})
}

print(unicodeArray)

Я уточню этот ответ, как только вы укажете, как вы получаете эти строки, так как я получаю недопустимую строковую ошибку с самого начала.

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