【问题标题】:How to remove zero width spaces from string in Swift? [duplicate]如何从 Swift 中的字符串中删除零宽度空格? [复制]
【发布时间】:2019-03-04 14:06:09
【问题描述】:

我需要从字符串中过滤掉不可见的字符。在附加的屏幕截图中,字符串“​Cilantro”有一些隐藏字符,当我在删除隐藏字符之前和之后得到它的计数时,它显示不同的字符数。

我只想过滤不可见字符而不是特殊字符,例如我不想过滤 á, ã è 等字符。

注意:我使用“删除”按钮删除了隐藏字符。

作为参考,我在这里添加了带有隐形字符的字符串:“​Cilantro”。我不确定它是否也会显示在你的最后。

【问题讨论】:

    标签: ios swift swift4


    【解决方案1】:

    Swift 5 或更高版本

    您可以使用新字符isLetter 属性

    let del = Character(UnicodeScalar(127)!)
    let string = "Cilantro\(del)\(del)"
    print(string.count) // "10\n"
    let filtered = string.filter { $0.isLetter }
    print(filtered.count)  // "8\n"
    

    let string = "cafe\u{301}"
    let filtered = string.filter { $0.isLetter }
    print(filtered)  // "café"
    

    如果您只想从字符串中删除零宽度空格,您可以执行以下操作:


    extension Character {
        static let zeroWidthSpace = Self(.init(0x200B)!)
        var isZeroWidthSpace: Bool { self == .zeroWidthSpace }
    }
    

    extension Bool {
        var negated: Bool { !self }
    }
    

    let str = "​Cilantro"
    print(str.count) // 9
    
    let filtered = str.filter(\.isZeroWidthSpace.negated)
    print(filtered.count) // 8
    

    【讨论】:

    • 从 Swift 5 开始,您可以简单地执行 string.filter { $0.isASCII }
    • @MartinR 很好,下个版本会有很多新东西。
    • 实际上你的实现有问题,它依赖于字符的“预组合”表示。试试let string = "cafe\u{301}"
    • @CMA 已编辑为仅过滤字母。如果您想允许数字、空格和换行符,您只需将其添加到逻辑{ $0.isLetter || $0.isNumber }
    猜你喜欢
    • 2012-07-03
    • 2018-02-19
    • 2022-01-24
    • 2014-08-04
    • 1970-01-01
    • 2012-11-19
    • 2014-02-12
    相关资源
    最近更新 更多