【问题标题】:How to split uncode string into characters如何将unicode字符串拆分为字符
【发布时间】:2020-03-28 15:10:07
【问题描述】:

我有像

这样的字符串
"\U0aac\U0ab9\U0ac1\U0ab5\U0a9a\U0aa8",
"\U0a97\U0ac1\U0ab8\U0acd\U0ab8\U0acb",
"\U0aa6\U0abe\U0ab5\U0acb",
"\U0a96\U0a82\U0aa1"

但我想用 unicode 字符分割这个字符串

我不知道该怎么做。我知道按功能分隔的组件,但在这里没有用。 \n任何帮助都会得到满足

【问题讨论】:

  • 你是如何获得这些刺的?
  • 这些是古吉拉特语字符串
  • 我理解这部分内容,但您是自己输入还是从 API 中检索?由于 API 很糟糕...您不能以这种方式格式化字符串。
  • 这里的“字符”是什么?请给出实际所需的输出。

标签: ios arrays swift string unicode


【解决方案1】:

如果您得到的字符串确实包含\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)
}

【讨论】:

    【解决方案2】:

    您可以映射您的数组,将其元素拆分为非 hexa 数字值,将它们压缩映射为 UInt32 值,用它们初始化 unicode 标量并将数组的结果元素映射到 UnicodeScalarView 并用它初始化一个新字符串:

    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)
    

    这将打印出来

    [“બહુવચન”、“ગુસ્સો”、“દાવો”、“ખંડ”]

    【讨论】:

    • 但是我们“通过 unicode 字符分割这个字符串”的部分在哪里?
    • @matt 如果这不是 OP 想要实现的目标,我可以简单地删除我的帖子,但 IMO 他只是不知道如何表达他的需求。
    • 可能是真的!我询问了所需输出的示例,但没有回应。所以我们不能确定。
    【解决方案3】:

    因此,返回的字符串已经包含“\”,因为要使用组件,您需要有一个额外的转义“\”,以便您能够执行以下操作:

    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)
    
    

    一旦您指定如何获取这些字符串,我将修改此答案,因为我从一开始就收到无效字符串错误。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2013-09-13
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多